C++ 17 make_optional constexpr-ness

Ziz*_*Tai 7 c++ std c++17

这个页面make_optionalC++ 17 中的函数返回一个constexpr optional<...>.我想(虽然我可能错了)这需要optional<T>有一个constexpr复制或移动构造函数.但是,这个页面也说不是这样的.

我不知道如何make_optional实现目前的C++ 1z草案.请参阅此帖子以获得澄清.是否有一些解决方法,或者它只是标准的草案/ cppreference的错误?

Ziz*_*Tai 2

感谢@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
}
Run Code Online (Sandbox Code Playgroud)

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

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