C ++ 17 make

该页面说C ++ 17中的make_optional函数返回一个constexpr optional<...> 。 我认为(我可能是错误的),这将要求optional<T>有一个constexpr复制或移动构造函数。 但是,这个页面也表示情况并非如此。

我不知道make_optional是如何实现的,因为C ++ 1z草案目前是这样。 看到这个帖子的澄清。 有没有解决方法,或者只是标准草案/ cppreference的错误?


感谢@Yakk和@TC的解释。 我觉得一个例子应该让事情更清楚:

struct wrapper {
    int value;

    // non-explicit constexpr constructor
    constexpr wrapper(int v) noexcept : value(v) {}

    // non-constexpr copy & move constructors
    wrapper(const wrapper& that) noexcept : value(that.value) {}
    wrapper(wrapper&& that) noexcept : value(that.value) {}
};

constexpr wrapper make_wrapper(int v)
{
    return {v};
}

int main()
{
    constexpr auto x = make_wrapper(123);  // error! copy/move construction,
                                           // but no constexpr copy/move ctor

    constexpr int y = make_wrapper(123).value;  // ok
    static_assert(y == 123, "");                // passed
}

所以make_wrapper成功返回了一个constexpr wrapper ; 它是复制/移动构造(尽管通常被编译器忽略),因为没有constexpr复制/移动构造函数,所以阻止编译代码。

我们可以验证constexpr返回的(临时)的-ness wrapper通过使用其成员值来初始化对象constexpr变量。


您可以直接在C ++ 11中使用return {something};构造返回值return {something}; 如果有任何非constexpr非明确的ctors,您可以从函数返回它。

链接地址: http://www.djcxy.com/p/34761.html

上一篇: C++17 make

下一篇: Anaconda ipython qtconsole launcher