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