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。
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 草案是这样的。有关说明,请参阅
您可以在 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。