C ++ 17 make
该页面说C ++ 17中的make_optional
函数返回一个constexpr optional<...>
。 我认为(我可能是错误的),这将要求optional<T>
有一个constexpr
复制或移动构造函数。 但是,这个页面也表示情况并非如此。
我不知道make_optional
是如何实现的,因为C ++ 1z草案目前是这样。 看到这个帖子的澄清。 有没有解决方法,或者只是标准草案/ cppreference的错误?
感谢@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
}
所以make_wrapper
成功返回了一个constexpr wrapper
; 它是复制/移动构造(尽管通常被编译器忽略),因为没有constexpr
复制/移动构造函数,所以阻止编译代码。
我们可以验证constexpr
返回的(临时)的-ness wrapper
通过使用其成员值来初始化对象constexpr
变量。
您可以直接在C ++ 11中使用return {something};
构造返回值return {something};
如果有任何非constexpr
非明确的ctors,您可以从函数返回它。
上一篇: C++17 make