C++ 为什么字符串文本上的decltype不能生成数组类型?

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")>

本标准在§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")>::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