标准将字符串文字的类型定义为§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;
false
false
我错过了什么?
答案 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]