C++字符串文字的类型

Jes*_*ond 5 c++ string types c++11 visual-studio-2012

出于好奇,我想知道C++字符串文字的真正底层类型是什么.

根据我观察到的情况,我会得到不同的结果.

一个类似于以下的类型测试:

std::cout << typeid("test").name() << std::endl;
Run Code Online (Sandbox Code Playgroud)

表明了我char const[5].

尝试将字符串文字分配给不兼容的类型,如此(查看给定的错误):

wchar_t* s = "hello";
Run Code Online (Sandbox Code Playgroud)

a value of type "const char *" cannot be used to initialize an entity of type "wchar_t *"来自VS12的IntelliSense.

但我不知道它是如何可能的,const char *因为VS12接受了以下行:

char* s = "Hello";
Run Code Online (Sandbox Code Playgroud)

我已经读过,这在C++ 11之前的标准中是允许的,因为它与C的复古兼容性,尽管修改s会导致未定义的行为.我假设这只是VS12还没有实现所有的C++ 11标准,并且这条线通常会导致错误.

阅读C99标准(从这里,6.4.5.5)表明它应该是一个数组:

然后使用多字节字符序列初始化静态存储持续时间和长度的数组,这足以包含序列.

那么,C++字符串文字下面的类型是什么?

非常感谢你宝贵的时间.

sya*_*yam 8

类型的字符串文字的确实const char[SIZE]其中SIZE是字符串加上空终止字符的长度.

你有时看到的事实const char*是因为通常的数组到指针衰减.

但我不知道它是如何可能的,const char *因为VS12接受了以下行: char* s = "Hello";

这是C++ 03中的正确行为(作为通常的const-correctness规则的一个例外),但它已被弃用.符合C++ 11的编译器不应接受该代码.

  • 在所有上下文中都不会出现"通常的数组到指针衰减".在C中,除非数组表达式是一元"&"或"sizeof"的操作数,否则它会发生,或者是用于初始化数组(子)对象的初始化程序中的字符串文字.C++有更多例外. (2认同)

Die*_*ühl 5

类型的字符串文字的是char const[N]其中N是一个字符包括终止空字符的数目.尽管这种类型的并没有转换为char*,C++的标准包括一个条款,允许串的分配给文字char*.添加此子句是为了支持兼容性,特别是对于当时没有的C代码const.

标准中类型的相关条款是2.14.5 [lex.string]第8段:

普通字符串文字和UTF-8字符串文字也称为窄字符串文字.窄字符串文字的类型为"n const char数组",其中n是下面定义的字符串大小,并且具有静态存储持续时间(3.7).