C++17 make_optional constexpr-ness

C++17 make_optional constexpr-ness

This page says that the make_optional function in C++17 returns a constexpr optional<...>. I think (I might be wrong though) this would require that optional<T> has a constexpr copy or move constructor. However, this page也说不是这样

我不知道 make_optional 如何实现,因为目前的 C++1z 草案是这样的。有关说明,请参阅 。是否有一些解决方法,或者这可能只是标准 draft/cppreference 的错误?

您可以在 C++11 中使用 return {something}; 直接构造 return 值如果有任何非显式构造函数是 constexpr 您可以 return一个函数。

感谢@Yakk 和@T.C。为了他们的解释。我觉得一个例子应该让事情更清楚:

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成功return一个constexpr wrapper;这是 copy/move 构造(尽管通常被编译器省略)阻止代码编译,因为没有 constexpr copy/move 构造函数。

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