出于好奇,我想知道C ++字符串文字的真正底层类型是什么。
根据我观察到的情况,我会得到不同的结果。
类似以下的typeid测试:
std::cout << typeid("test").name() << std::endl;
告诉我char const[5]
。
尝试将字符串文字分配给不兼容的类型,如此(查看给定的错误):
wchar_t* s = "hello";
我从VS12的IntelliSense获得a value of type "const char *" cannot be used to initialize an entity of type "wchar_t *"
。
但我不知道它是如何const char *
因为VS12接受以下行:
char* s = "Hello";
我已经读过,这在C ++ 11之前的标准中是允许的,因为它与C的复古兼容性,尽管s
的修改会导致未定义的行为。我假设这只是VS12还没有实现所有的C ++ 11标准,并且这一行通常会导致错误。
阅读C99标准(from here,6.4.5.5)表明它应该是一个数组:
多字节字符 然后,序列用于初始化静态存储持续时间和长度的数组 足以容纳序列。
那么, C ++字符串文字下面的类型是什么?
非常感谢你宝贵的时间。
答案 0 :(得分:8)
字符串文字的类型确实是const char[SIZE]
,其中SIZE
是字符串的长度加上空终止字符。
您有时看到const char*
的事实是因为通常的数组到指针衰减。
但我不知道它是如何
const char *
因为VS12接受以下行:char* s = "Hello";
这是C ++ 03中的正确行为(作为通常的const-correctness规则的一个例外),但它已被弃用。符合C ++ 11的编译器不应接受该代码。
答案 1 :(得分:5)
字符串文字的类型为char const[N]
,其中N
是包含终止空字符的字符数。虽然此类型不转换为char*
,但C ++标准包含一个允许将字符串文字赋值给char*
的子句。添加此子句是为了支持兼容性,尤其是当时没有const
的C代码。
标准中类型的相关条款是2.14.5 [lex.string]第8段:
普通字符串文字和UTF-8字符串文字也称为窄字符串文字。窄字符串文字的类型为“n const char数组”,其中n是下面定义的字符串大小,并且具有静态存储持续时间(3.7)。
答案 2 :(得分:-1)
首先,C ++字符串文字的类型是 n const char
的数组。其次,如果要使用字符串文字初始化wchar_t,则必须编写代码:
wchar_t* s = L"hello"