在C++ 11标准中,它表示char*p ="abc"; 是不是形成了?

Wak*_*zil 4 c++ standards c++11

C++ 11标准中的哪个地方说它char* p = "abc";是不正确的?

And*_*owl 8

这在C++ 03中仍然有效(虽然已弃用),但在C++ 11中已经发生了变化.C++ 11标准的附录C(见C1.1)提到:

更改:字符串文字const

字符串文字的类型从"数组char" 更改为"数组" const char.char16_t字符串文字的类型 从"某个整数类型的数组"更改为"数组" const char16_t.char32_t字符串文字的类型是从"some-integer-type"数组改为"array of const char32_t".宽字符串文字的类型从"array of wchar_t" 更改为"array of " 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
}
Run Code Online (Sandbox Code Playgroud)

在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"可以被转换为类型"指针的prvalue cv2 T"如果" cv2 T"是 cv-qualified不是" cv1 T".

  • 注意,标准的例子使用了糟糕的风格.在这种情况下,明确指定`const_cast`会好得多. (2认同)