在 C++11 标准中哪里说 char* p = "abc" ;格式不正确?

Where in the C++11 Standard does it say that char* p = "abc"; is ill-formed?

本文关键字:abc 格式 不正确 标准 C++11 char      更新时间:2023-10-16

在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字符串文本的类型从"某个整数类型的数组"更改为"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如果 "cv2 T" 是 比《cv1 T》更cv合格