在 C++11 标准中哪里说格式不char* p = "abc";
正确?
1 回答
这在 C++03 中仍然有效(尽管已弃用),但在 C++11 中情况发生了变化。C++11 标准的附件 C 提到(参见 C1.1):
更改:制作的字符串文字
const
字符串文字的类型从“array of
char
”更改为“array of ”const char
。字符串字面量的类型char16_t
从“一些整数类型的数组”更改为“. 的数组”const char16_t
。字符串字面量的类型char32_t
从“一些整数类型的数组”更改为“. 的数组”const char32_t
。宽字符串字面量的类型从“array ofwchar_t
”更改为“array of ”const wchar_t
。</p>基本原理:这避免了调用不适当的重载函数,该函数可能期望能够修改其参数。
对原始特征的影响:改变定义明确的特征的语义。
转换难度:句法转换。解决方法是添加演员表:
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 字符串文字也称为窄字符串文字。窄字符串文字的类型为“<strong>array of
n const char
”,其中n
是字符串的大小,定义如下,并且具有静态存储持续时间 (3.7)。
和 4.4/1(有关数组到指针的转换,另请参见 4.2):
如果“<code>cv2 T”比“<code>cv1 T”更合格,则“pointer to” 类型的prvalue
cv1 T
可以转换为“pointer to ”类型的prvalue。cv2 T
cv