This page表示C 17中的make_optional函数返回constexpr optional< ...> ;.我想(虽然我可能错了)这需要可选的< T>有一个constexpr副本或移动构造函数.然而,this page也表示情况并非如此.
我不知道make_optional是如何实现的,因为目前的C 1z草案就是如此.有关说明,请参阅this post.是否有一些解决方法,或者它只是标准草案/ cppreference的错误?
解决方法
感谢@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包装器;它是复制/移动构造(尽管通常由编译器省略),它阻止代码编译,因为没有constexpr复制/移动构造函数.
我们可以通过使用其成员值初始化constexpr变量来验证返回(临时)包装器对象的constexpr-ness.