我可以从constexpr函数返回一个可选项吗?

时间:2013-05-07 13:10:47

标签: c++ boost std constexpr boost-optional

  • 我可以从optional函数返回constexpr吗?
  • 为什么?
  • 如果是的话,它是如何运作的?

我对boost::optionalstd::optional感兴趣。他们的行为是否相同?

2 个答案:

答案 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