![](/img/trans.png)
[英]How to convert C++17's "if constexpr(std::is_literal_type<T>::value)" to C++11 SFINAE code?
[英]Deprecated std::is_literal_type in C++17
如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
特征。 哪個尚未存在。
但是,(已經實現的)特性沒有任何損害,並允許編譯時內省檢查給定模板參數可能滿足的核心語言類型類別。 在核心工作組退出文字類型的概念之前,應保留相應的庫特征。
刪除(棄用之后)的下一步是撰寫一篇文章,建議在棄用/刪除類型特征時從核心語言中刪除該術語。
所以計划最終要擺脫“文字類型”的整個定義,用更細粒度的東西取而代之。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.