【问题标题】:Reference to initializer_list in noexcept specifier of std::optional在 std::optional 的 noexcept 说明符中引用 initializer_list
【发布时间】:2021-12-21 11:45:59
【问题描述】:

我对此code有疑问:

    explicit constexpr
    optional(in_place_t, initializer_list<_Up> __il, _Args&&... __args)
    noexcept(is_nothrow_constructible_v<_Tp, initializer_list<_Up>&,
                        _Args...>)
    : _Base(std::in_place, __il, std::forward<_Args>(__args)...) { }

为什么在这里使用参考?初始化列表作为值传递给std::optional。我想这可能与它在这种情况下是一个命名参数有关,但我不确定。

【问题讨论】:

    标签: c++ optional initializer-list libstdc++ noexcept


    【解决方案1】:

    当您使用is_nothrow_constructible 和其他各种类型特征时,有一个约定,左值引用类型T&amp; 表示“T 类型的左值”,而非引用类型T 表示“类型的右值T"。在这种情况下,如果第一个参数是initializer_list&lt;_Up&gt; 类型的左值,则会进行测试以查看_Tp 是否不可构造。

    【讨论】:

    • 这种行为记录在哪里?而且,T&amp;&amp; 不应该用于右值吗?
    • 如果我错了,请原谅我,但我在您提到的页面上找不到任何相关信息。你能详细说明一下这个话题吗?我认为这些特征应该以简单的方式起作用,例如:is_nothrow_constructible&lt;Foo, int&gt;is_nothrow_constructible&lt;Foo, int&amp;&gt;is_nothrow_constructible&lt;Foo, int&amp;&amp;&gt;
    • @wehin19066 is_nothrow_constructible 的定义引用了is_constructible。第 8 段提到了is_constructible 如何使用declvaldeclval&lt;T&gt;() 返回T&amp;&amp;。根据引用折叠规则,如果TU&amp;,那么T&amp;&amp;U&amp;。换句话说,提供给declval 的左值引用类型将产生一个左值参数。
    • 还有一个问题。在使用带有转发引用的 is_nothrow_constructible 之类的特征时应该如何操作?在这种情况下是否需要指定&amp;
    猜你喜欢
    • 2016-02-13
    • 2016-05-28
    • 1970-01-01
    • 2021-01-02
    • 2023-03-20
    • 2020-05-08
    • 2014-01-17
    • 2015-06-28
    • 2019-03-11
    相关资源
    最近更新 更多