[英]Where in the C++11 Standard does it say that char* p = “abc”; is ill-formed?
在C ++ 11标准中,它表示char* p = "abc";
是不是形成了?
这在C ++ 03中仍然有效(虽然已弃用),但在C ++ 11中已经发生了变化。 C ++ 11标准的附录C(见C1.1)提到:
更改 :字符串文字使
const
字符串文字的类型从“
char
ofchar
”更改为“const char
数组。”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字符串文字也称为窄字符串文字。 窄字符串文字的类型为“
n const char
数组 ”,其中n
是下面定义的字符串大小,并且具有静态存储持续时间(3.7)。
4.4 / 1(有关数组到指针的转换,请参见4.2):
如果“
cv2 T
”比“cv1 T
” 更加cv
cv2 T
则可以将类型“指向cv1 T
指针”的prvalue转换为“指向cv2 T
指针”的cv1 T
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.