在C ++ 11标准中哪里说char* p = "abc";
格式不正确?
答案 0 :(得分:8)
这在C ++ 03中仍然有效(虽然已弃用),但在C ++ 11中已经发生了变化。 C ++ 11标准的附录C(见C1.1)提到:
更改:字符串文字
const
字符串文字的类型从“
char
数组”更改为“const char
数组。”a的类型char16_t
字符串文字从“some-integer-type数组”更改为“const char16_t
数组。”char32_t
字符串文字的类型从“some-integer-type数组”更改为“const char32_t
数组”。 宽字符串文字的类型从“wchar_t
”数组更改为“const wchar_t
数组”。基本原理:这可以避免调用不合适的重载函数,这可能会导致 修改其论点。
对原始功能的影响:更改为定义明确的功能的语义。
难以转换:语法转换。修复是添加一个演员:
char* p = "abc"; // valid in C, invalid in C++ void f(char*) { char* p = (char*)"abc"; // OK: cast added f(p); f((char*)"def"); // OK: cast added }
在C ++ 03中,这是隐式转换规则的一个例外。在C ++ 11中,这个异常消失了,这也许就是为什么你在标准中找不到这种情况的原因。
上面引用的段落已被添加到附件C中(仅提供信息,而不是规范性的),以便您可以找到突破性变化的证据。
无论如何,相关段落是2.14.5 / 8:
普通字符串文字和UTF-8字符串文字也称为窄字符串文字。一个箭头 string literal的类型为“数组
n const char
”,其中n
是字符串的大小,如下所示,并且 静态存储时间(3.7)。
4.4 / 1(有关数组到指针的转换,请参见4.2):
如果“
cv1 T
”是,则“cv2 T
指针”类型的prvalue可以转换为类型为“cv2 T
指针”的prvalue 更多cv
- 合格而不是“cv1 T
”。