This page表示C ++ 17中的make_optional
函数返回constexpr optional<...>
。我想(虽然我可能错了)这需要optional<T>
有一个constexpr
副本或移动构造函数。但是,this page也表示情况并非如此。
我不知道{C} 1z草案目前的实现方式make_optional
如何实现。有关说明,请参阅this post。是否有一些解决方法,或者可能只是标准草案/ cppreference的错误?
答案 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
,您可以从函数返回它。