根据cppreference,特征std::is_literal_type
在C ++ 17中已弃用。问题是为什么和什么是首选替换,以便将来检查类型是否为literal type。
答案 0 :(得分:21)
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
特质。现在还没有。
但是,(已经实现的)特征没有任何危害,并允许编译时内省检查给定模板参数可能满足的核心类型类别。在核心工作组退出文字类型的概念之前,应保留相应的库特征。
删除(弃用之后)的下一步是写一篇论文,建议在弃用/删除类型特征时从核心语言中删除该术语。
所以计划最终要摆脱“文字类型”的整个定义,用更细粒度的东西取而代之。