C ++字符串文字的类型

时间:2013-08-24 21:15:44

标签: c++ string visual-studio-2012 c++11 types

出于好奇,我想知道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 ++字符串文字下面的类型是什么?

非常感谢你宝贵的时间。

3 个答案:

答案 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"