2016-03-08 42 views
5

雖然實施std::experimental::optionalcppreference.com)我被特定構造的規範,即困惑:的std ::實驗::可選<T>實現:Constexpr構造混亂

constexpr optional(const T& value); // (4) 

Source

該構造函數允許optional<T>用於簡單破壞類型T,可在constexpr上下文中構造。雖然第一個要求,即在這種情況下關閉用戶提供的析構函數以使文字類型爲optional<T>可以直接解決,但我不知道如何解決放置的限制 - 新增不允許在constexpr

我以爲我應該實施optional<T>使用std::aligned_storage<T>允許類型T非默認可構造和滿足任何對齊要求,如果適用。但正如我所說,constexpr禁止我在該特定構造函數中使用放置新元素。

我需要多少咖啡,但在這裏沒有看到明顯的解決方案嗎?

謝謝

+0

可能的重複[如何使用std :: optional?](http://stackoverflow.com/questions/16860960/how-should-one- use-stdoptional) – Matriac

+2

@Matriac這是一個關於實現方面的問題。 – nshct

+1

一個'union'可能適用於這個特定的構造函數,但我不確定它足以處理所有的情況。 – hvd

回答

4

我不知道怎麼去解決安置,新的沒有被允許在constexpr的限制。

這是一個正確的診斷,字面類型,constexpr和新的表達式不混合。滿足std::experimental::optional<T>各種要求最直接的方法是使用變體成員來實現它。說白了,一個union必須在某個時候參與。速寫:

template<typename Val> 
struct optional { 
    union { 
     Val optional_value; 
     unsigned char dummy_byte; 
    }; 
    bool filled; 

    // post-condition: no-value state 
    constexpr optional() 
     : dummy_byte {} 
     , filled(false) 
    {} 

    // post-condition: has-value state 
    constexpr optional(Val const& val) 
     : optional_value(val) 
     , filled(true) 
    {} 

    // other special members omitted for brevity 
}; 

Live On Coliru

由於事實上,老系列optional建議用於have a paragraph on the technique證明它提出的要求是合理的。 (現在std::experimental::optional住在各種圖書館基礎知識候選TS中。)

+0

謝謝。我不知道我爲什麼如此專注於aligned_storage,但這是正確的解決方案。 – nshct