C++ 为什么字符串文本上的decltype不能生成数组类型?
本标准在§2.13.5/8中定义了字符串文字的类型: 普通字符串文字和UTF-8字符串文字也称为窄字符串文字。窄字符串文字的类型为“array of n const char”,其中n是下面定义的字符串大小,具有静态存储持续时间(3.7) 因此,例如,C++ 为什么字符串文本上的decltype不能生成数组类型?,c++,arrays,string,c++11,decltype,C++,Arrays,String,C++11,Decltype,本标准在§2.13.5/8中定义了字符串文字的类型: 普通字符串文字和UTF-8字符串文字也称为窄字符串文字。窄字符串文字的类型为“array of n const char”,其中n是下面定义的字符串大小,具有静态存储持续时间(3.7) 因此,例如,“sss”应该有一个类型char const[4](除非我读错了) 但这个简单的片段: std::cout << std::boolalpha << std::is_pointer<decltype("sss")>
“sss”
应该有一个类型char const[4]
(除非我读错了)
但这个简单的片段:
std::cout << std::boolalpha << std::is_pointer<decltype("sss")>::value << '\n';
std::cout << std::boolalpha << std::is_array<decltype("sss")>::value;
我缺少什么?字符串文字是左值([expr.prim.general]/p1): 文本是一个主要表达式。其类型取决于其形式(2.13)。字符串文字是左值;所有其他文字都是prvalues
decltype(expr)
当表达式expr
是左值表达式([dcl.type.simple]/p4)时,返回左值引用:
对于表达式e,decltype(e)表示的类型定义为
如下:
- 如果e是一个未加密的id表达式或未加密的类成员访问(5.2.5),decltype(e)是实体的类型 由e。如果没有这样的实体,或者如果e命名了一组 函数重载,程序格式不正确李>
- 否则,如果e是xvalue,decltype(e)是T&&,其中T是e的类型李>
- 否则,如果e是左值,decltype(e)是T&,其中T是e的类型李>
- 否则,decltype(e)就是e的类型
N
const char
的数组,但您所经历的是decltype
的影响。您真正拥有的是类型字符常量(&)[N]
,而不是字符常量[N]
只需删除引用即可获得所需的行为:
std::is_array<std::remove_reference_t<decltype("sss")>>::value;
std::is_array::value;
您必须首先删除引用,因为decltype
推导的类型是const char(&)[N]
,而不仅仅是const char[N]
:
std::cout << std::boolalpha << std::is_array<
typename std::remove_reference<decltype("sss")>::type
>::value << '\n'; // true
std::cout高度相关:
std::cout << std::boolalpha << std::is_array<
typename std::remove_reference<decltype("sss")>::type
>::value << '\n'; // true