Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 不推荐使用的std::是C+中的“文字”类型+;17_C++_Std_C++17_Deprecated_Typetraits - Fatal编程技术网

C++ 不推荐使用的std::是C+中的“文字”类型+;17

C++ 不推荐使用的std::是C+中的“文字”类型+;17,c++,std,c++17,deprecated,typetraits,C++,Std,C++17,Deprecated,Typetraits,根据,该特性在C++17中被弃用。问题是为什么和未来检查一种类型是否为a的首选替代品是什么。: is_literal类型特性对泛型代码的价值可以忽略不计,因为真正需要的是知道特定构造将产生常量初始化的能力。至少有一个constexpr构造函数的文本类型的核心术语太弱,无法有意义地使用 基本上,它所说的是,没有任何代码可以用is\u literal\u type\u v来保护,并且足以确保您的代码实际上是constexpr。这还不够好: template<typename T> std

根据,该特性在C++17中被弃用。问题是为什么未来检查一种类型是否为a的首选替代品是什么。

is_literal
类型特性对泛型代码的价值可以忽略不计,因为真正需要的是知道特定构造将产生常量初始化的能力。至少有一个constexpr构造函数的文本类型的核心术语太弱,无法有意义地使用

基本上,它所说的是,没有任何代码可以用
is\u literal\u type\u v
来保护,并且足以确保您的代码实际上是constexpr。这还不够好:

template<typename T>
std::enable_if_t<std::is_literal_type_v<T>, void> SomeFunc()
{
  constexpr T t{};
}
模板
std::如果启用SomeFunc()则启用
{
constexpr T{};
}
不能保证这是合法的。即使你用
is\u default\u constructible
来保护它,这并不意味着它是constexpr default constructible

您需要的是一个
是可构造的
特性。目前还不存在

然而,(已经实现的)特性并没有坏处,并且允许编译时内省,对于给定模板参数可能满足的核心语言类型类别。在核心工作组放弃文字类型的概念之前,应该保留相应的库特征

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


因此,我们的计划是最终摆脱“文字类型”的整个定义,用更细粒度的东西来代替它。

有趣的是,我认为
std::is_literal_type
提供了一个安全的检查类型是否可以在constexpr表达式中使用的方法。尽管如此,这是一个很好的答案。但是你能用它来检查函数参数吗,例如在中,或者在某些情况下它也会中断吗?@berkus:用于什么目的<应用于模板的code>constepr始终是有条件的。如果您用一个使函数违反
constexpr
规则的类型实例化它,那么它就不是
constexpr
。“支票”的意义是什么?如果
T
没有
constexpr
运算符+
(该检查未测试该运算符),则该函数也不会是
constexpr
。那么,这又有什么意义呢?尼科尔博拉斯不再确定,这是关于我已经忘记的C++的一些讨论。我猜这是为了在违反constexpress时提供更合理的错误消息,但当前的gcc/clang似乎提供了相当熟练的消息。很抱歉打扰您。@nosensetal:实际上,我对requires表达式中的
constexpr
声明的理解是错误的。它们只能有表达式,不能有这样的声明。