4

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

4

1 回答 1

8

这在 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 of wchar_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” 类型prvaluecv1 T可以转换为“pointer to ”类型的prvalue。cv2 Tcv

于 2013-07-04T13:29:27.307 回答