簡體   English   中英

我可以從constexpr函數返回一個可選項嗎?

[英]Can I return an optional from a constexpr function?

  • optionalconstexpr函數返回一個optional嗎?
  • 為什么?
  • 如果是,它是如何工作的?

我對boost::optionalstd::optional感興趣。 他們的行為是否相同?

constexpr函數無法返回boost::optional 或者至少,文檔不保證這一點。

但是,由接受的C ++ 14提議定義的std::optional 可以constexpr函數返回。 但是, 只有 optional的類型參數是optional輕易破壞的。

這允許std::optional的析構函數在這些情況下是微不足道的。 在這一點上,破壞對象沒有任何困難,因此沒有什么能阻止std::optional成為文字類型。

該提議非常明確。 如果T是可以輕易破壞的,那么大多數optional的構造函數將是constexpr ,而optional<T>將是文字類型。 因此,它可以在constexpr函數中創建。

Boost.Optional不支持constexpr ,主要是因為它是在C ++ 11發布之前編寫的。

std::optional當前提議確實支持constexpr ,只要值類型T可以簡單地破壞。 它的工作原理是因為 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM