optional
函数返回constexpr
吗? 我对boost::optional
和std::optional
感兴趣。他们的行为是否相同?
答案 0 :(得分:10)
boost::optional
函数无法返回 constexpr
。或者至少,文档没有提供保证。
但是,std::optional
,由接受的C ++ 14提议定义,可以由constexpr
函数返回。但 仅 ,如果optional
的类型参数可以轻易破坏。
这允许std::optional
的析构函数在这些情况下是微不足道的。在这一点上,破坏对象没有任何困难,因此没有什么能阻止std::optional
成为文字类型。
The proposal is quite clear on this.如果T
可以轻易破坏,那么optional
的大多数构造函数将是constexpr
,而optional<T>
将是文字类型。因此,它可以在constexpr
函数中创建。
答案 1 :(得分:6)
Boost.Optional不支持constexpr
,主要是因为它是在C ++ 11发布之前编写的。
current proposal for std::optional
确实支持constexpr
,只要值类型T
可以轻易破坏。工会允许works because constexpr
个构造函数(7.1.5p4);编译器跟踪初始化哪个union成员,确保在编译时捕获访问脱离可选值的未定义行为:
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;
};
值类型必须是可以轻易破坏的,因为constexpr
仅对文字类型有用,它们本身必须有一个简单的析构函数。
例如,写作:
constexpr optional_storage<int> o{};
constexpr int i = o.value_;
gcc给出错误:
error: accessing ‘optional_storage<int>::value_’ member instead of initialized
‘optional_storage<int>::dummy_’ member in constant expression