C++ 我可以从constexpr函数返回可选值吗? 我可以从constexpr函数返回可选的 为什么? 如果是,它是如何工作的
我对C++ 我可以从constexpr函数返回可选值吗? 我可以从constexpr函数返回可选的 为什么? 如果是,它是如何工作的,c++,boost,std,constexpr,boost-optional,C++,Boost,Std,Constexpr,Boost Optional,我对boost::optional和std::optional都感兴趣。它们的行为是否相同?boost::optional无法通过constepr函数返回。或者至少,文档没有对此提供任何保证 但是,std::optional,如接受的C++14提案所定义,可以通过constepr函数返回。但是仅当可选的的类型参数是可破坏的 这使得std::optional的析构函数在这些情况下变得微不足道。在这一点上,销毁对象并不困难,因此没有任何东西可以阻止std::optional成为文本类型 如果T是可破
boost::optional
和std::optional
都感兴趣。它们的行为是否相同?boost::optional
无法通过constepr
函数返回。或者至少,文档没有对此提供任何保证
但是,std::optional
,如接受的C++14提案所定义,可以通过constepr
函数返回。但是仅当可选的
的类型参数是可破坏的
这使得std::optional
的析构函数在这些情况下变得微不足道。在这一点上,销毁对象并不困难,因此没有任何东西可以阻止std::optional
成为文本类型
如果
T
是可破坏的,那么optional
的大多数构造函数将是constexpr
,而optional
将是文本类型。因此,它可以在constexpr
函数中创建。Boost.Optional不支持constexpr
,主要是因为它是在C++11发布之前编写的
只要值类型T
是可破坏的,则不支持constexpr
。它constexpr
允许构造函数用于工会(7.1.5p4);编译器跟踪初始化的联合成员,确保在编译时捕捉到访问分离的可选值的未定义行为:
struct dummy_t {};
template <class T>
union optional_storage {
static_assert( is_trivially_destructible<T>::value, "" );
dummy_t dummy_;
T value_;
constexpr optional_storage(): dummy_{} {} // disengaged
constexpr optional_storage(T const& v): value_{v} {} // engaged
~optional_storage() = default;
};
gcc给出了错误:
error: accessing ‘optional_storage<int>::value_’ member instead of initialized
‘optional_storage<int>::dummy_’ member in constant expression
错误:访问'optional_storage::value_'成员而不是已初始化
常量表达式中的'optional_storage::dummy_'成员
带有std::可选您确定吗?@sehe感谢您的编辑!std::optional
和boost::optional
之间的区别是什么?在c++11的boost::optional
中有可能实现吗?
error: accessing ‘optional_storage<int>::value_’ member instead of initialized
‘optional_storage<int>::dummy_’ member in constant expression