C++ 17中不推荐使用std :: is_literal_type

pla*_*cel 19 c++ std deprecated type-traits c++17

根据cppreference,该特性std::is_literal_type在C++ 17中已被弃用.问题是为什么以及什么是未来的首选替代品来检查类型是否是文字类型.

Nic*_*las 22

如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{};
}
Run Code Online (Sandbox Code Playgroud)

不保证这是合法的.即使你用它来保护它is_default_constructible<T>并不意味着它是constexpr默认的可构造性.

你需要的是一个is_constexpr_constructible特质.哪个尚未存在.

但是,(已经实现的)特性没有任何损害,并允许编译时内省检查给定模板参数可能满足的核心语言类型类别.在核心工作组退出文字类型的概念之前,应保留相应的库特征.

删除(弃用之后)的下一步是撰写一篇文章,建议在弃用/删除类型特征时从核心语言中删除该术语.

所以计划最终要摆脱"文字类型"的整个定义,用更细粒度的东西取而代之.