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

时间:2016-10-31 23:00:40

标签: c++ std c++17 deprecated typetraits

根据cppreference,特征std::is_literal_type在C ++ 17中已弃用。问题是为什么什么是首选替换,以便将来检查类型是否为literal type

1 个答案:

答案 0 :(得分:21)

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特质。现在还没有。

  

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

     

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

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