C++17 make_optional constexpr-ness
C++17 make_optional constexpr-ness
此页面说C 17中的make_optional
功能返回constexpr optional<...>
。我认为(虽然我可能错了)这将要求optional<T>
具有constexpr
复制或移动构造函数。但是,此页面也说事实并非如此。
我不知道如何实现make_optional
,因为当前C 1Z草稿。请参阅此帖子以进行澄清。是否有解决方法,或者这只是标准草稿/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 wrapper
;由于没有constexpr
复制/移动构造函数,因此是防止代码编译的副本/移动构造(虽然通常由编译器所阐明)。
我们可以通过使用其成员值来初始化constexpr
变量来验证返回(临时)wrapper
对象的constexpr
-性。
您可以在return {something};
中直接在C 11中构建返回值,如果有任何非宣传ctors constexpr
,您可以从函数中返回它。
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 多成员Constexpr结构初始化
- 条件constexpr函数
- constexpr 函数中的非文字(通过 std::is_constant_evaluated)
- Visual C++ constexpr Hints
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 为什么constexpr的性能比正常表达式差
- 是否可以使用if constexpr删除控制流语句
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 为什么std::isnan 不是 constexpr?
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 更多constexpr容器是否需要mark_immutable_if_consexpr
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- constexpr上下文中std::initializer_list的验证
- Clang, std::next, libstdc++ and constexpr-ness
- 海湾合作委员会和Clang在lambda的constexpr-ness上存在分歧?
- lambda内部捕获的constexpr变量失去了其constexpr-ness
- C++17 make_optional constexpr-ness
- 非成员函数 begin()/cbegin() 及其 constexpr-ness