为什么字符串文字上的decltype不会产生数组类型?

时间:2015-05-17 23:41:11

标签: c++ arrays string c++11 decltype

标准将字符串文字的类型定义为§2.13.5/ 8,如下:

  

普通字符串文字和UTF-8字符串文字也称为窄字符串文字。窄字符串文字的类型为“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;

gives

false
false

我错过了什么?

2 个答案:

答案 0 :(得分:19)

字符串文字是左值([expr.prim.general] / p1):

  

文字是主要表达方式。它的类型取决于它的形式(2.13)。字符串文字是左值;所有其他文字都是prvalues。

当表达式decltype(expr)是左值表达式([dcl.type.simple] / p4)时,

expr返回左值引用:

  

对于表达式e,由decltype(e)表示的类型定义为   如下:

     
      
  • 如果e是未加密码的id-expression或不加括号的类成员访问(5.2.5),则decltype(e)是实体的类型   以e命名。如果没有这样的实体,或者e命名一组   超载的功能,该程序是不正确的;
  •   
  • 否则,如果e是x值,则decltype(e)是T&amp;&amp;,其中T是e的类型;
  •   
  • 否则,如果e是左值,则decltype(e)是T&amp;,其中T是e的类型;
  •   
  • 否则,decltype(e)是e的类型。
  •   

字符串文字N const char数组,但您遇到的是decltype的效果。你真正拥有的是char const(&)[N]类型,不是 char const[N]

简单地删除引用应该为您提供所需的行为:

std::is_array<std::remove_reference_t<decltype("sss")>>::value;

答案 1 :(得分:5)

您必须先删除引用,因为# turn to default and even worse options(expressions = 5000) power.rec(2, 1e3) #Error: evaluation nested too deeply: infinite recursion / options(expressions=)? #Error during wrapup: evaluation nested too deeply: infinite recursion / options(expressions=)? # works in updated parameter options(expressions = 100000) power.rec(2, 1e3) #[1] 1.071509e+301 # stack overflow error again power.rec(2, 1e4) #Error: protect(): protection stack overflow 推导出的类型为decltype,而不仅仅是const char (&)[N]

const char [N]