2016-10-31 77 views

回答

13

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特质。这还不存在。

然而,(已经实现)特质并没有不良影响,并允许编译时内省为其核心语言类型类别指定模板参数可能满足。在核心工作组撤销字面类型的概念之前,应该保留相应的库特征。

接下来的步骤(弃用之后)将写一篇论文,建议从核心语言中删除该术语,同时不赞成/删除类型特征。

因此,这个计划是最终摆脱“字面类型”的整体定义,用更细致的东西取而代之。

+0

有趣的是,我认为'std :: is_literal_type'提供了一个安全检查是否可以在constexpr表达式中使用类型。不过,这是一个很好的答案。 – plasmacel

相关问题