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++字符串文字下面的类型是什么?
非常感谢你宝贵的时间.
类型的字符串文字的确实const char[SIZE]其中SIZE是字符串加上空终止字符的长度.
你有时看到的事实const char*是因为通常的数组到指针衰减.
但我不知道它是如何可能的,
const char *因为VS12接受了以下行:char* s = "Hello";
这是C++ 03中的正确行为(作为通常的const-correctness规则的一个例外),但它已被弃用.符合C++ 11的编译器不应接受该代码.
类型的字符串文字的是char const[N]其中N是一个字符包括终止空字符的数目.尽管这种类型的并没有转换为char*,C++的标准包括一个条款,允许串的分配给文字char*.添加此子句是为了支持兼容性,特别是对于当时没有的C代码const.
标准中类型的相关条款是2.14.5 [lex.string]第8段:
普通字符串文字和UTF-8字符串文字也称为窄字符串文字.窄字符串文字的类型为"n const char数组",其中n是下面定义的字符串大小,并且具有静态存储持续时间(3.7).