C ++ 17 make_optional constexpr-ness

时间:2016-06-21 00:04:57

标签: c++ std c++17

This page表示C ++ 17中的make_optional函数返回constexpr optional<...>。我想(虽然我可能错了)这需要optional<T>有一个constexpr副本或移动构造函数。但是,this page也表示情况并非如此。

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

2 个答案:

答案 0 :(得分:2)

感谢@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成功返回constexpr wrapper;它是复制/移动构造(尽管通常由编译器省略),它阻止代码编译,因为没有constexpr复制/移动构造函数。

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

答案 1 :(得分:1)

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

相关问题