[英]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.