2016-10-31 53 views

回答

13

As stated in P0174

is_literal型性狀提供了可以忽略不計值,以通用代碼,因爲真正需要的是要知道具體的建設將產生恆定的初始化的能力。具有至少一個constexpr構造函數的文字類型的核心術語太弱而無法有效使用。

基本上,它的意思是,有沒有代碼,你可以用is_literal_type_v防守並具有足以確保您的代碼實際上是constexpr。這不夠好:

template<typename T> 
std::enable_if_t<std::is_literal_type_v<T>, void> SomeFunc() 
{ 
    constexpr T t{}; 
} 

不能保證這是合法的。即使你用is_default_constructible<T>來保護它,並不意味着它是constexpr默認可構造的。

你需要的是一個is_constexpr_constructible特質。這還不存在。

然而,(已經實現)特質並沒有不良影響,並允許編譯時內省爲其核心語言類型類別指定模板參數可能滿足。在覈心工作組撤銷字面類型的概念之前,應該保留相應的庫特徵。

接下來的步驟(棄用之後)將寫一篇論文,建議從核心語言中刪除該術語,同時不贊成/刪除類型特徵。

因此,這個計劃是最終擺脫「字面類型」的整體定義,用更細緻的東西取而代之。

+0

有趣的是,我認爲'std :: is_literal_type'提供了一個安全檢查是否可以在constexpr表達式中使用類型。不過,這是一個很好的答案。 – plasmacel

相關問題