![](/img/trans.png)
[英]Can't initialize constexpr value from return value of constexpr function
[英]Can I return an optional from a constexpr function?
optional
從constexpr
函數返回一個optional
嗎? 我對boost::optional
和std::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.