Wak*_*zil 4 c++ standards c++11
C++ 11标准中的哪个地方说它char* p = "abc";是不正确的?
这在C++ 03中仍然有效(虽然已弃用),但在C++ 11中已经发生了变化.C++ 11标准的附录C(见C1.1)提到:
更改:字符串文字
const字符串文字的类型从"数组
char" 更改为"数组"const char.char16_t字符串文字的类型 从"某个整数类型的数组"更改为"数组"const char16_t.char32_t字符串文字的类型是从"some-integer-type"数组改为"array ofconst char32_t".宽字符串文字的类型从"array ofwchar_t" 更改为"array of "const wchar_t.基本原理:这可以避免调用不适当的重载函数,该函数可能希望能够修改其参数.
对原始特征的影响:改变定义明确的特征的语义.
转换难度:句法转换.修复是添加一个演员:
Run Code Online (Sandbox Code Playgroud)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):
类型的prvalue"指针
cv1 T"可以被转换为类型"指针的prvaluecv2 T"如果"cv2 T"是 更cv-qualified不是"cv1 T".