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
性。
return {something};
。如果有任何非显式的构造函数是 constexpr
,则可以从函数中返回它。std::make_optional
返回一个constexpr std::optional
,在我的(和你的)示例中,make_wrapper
无法返回一个constexpr Wrapper
。 - Zizheng Taiconstexpr std::optional
?它返回的是 std::optional
。它是一个 constexpr
函数模板。 - T.C.return
,而在于 =
。 - Zizheng Tai
constexpr
,你知道的... - T.C.