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

时间:2013-07-04 13:25:33

标签: c++ c++11 standards

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

1 个答案:

答案 0 :(得分:8)

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

  

更改:字符串文字const

     

字符串文字的类型从“char数组”更改为“const char数组。”a的类型   char16_t字符串文字从“some-integer-type数组”更改为“const char16_t数组。”   char32_t字符串文字的类型从“some-integer-type数组”更改为“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字符串文字也称为窄字符串文字。一个箭头   string literal的类型为“数组n const char ”,其中n是字符串的大小,如下所示,并且   静态存储时间(3.7)。

4.4 / 1(有关数组到指针的转换,请参见4.2):

  

如果“cv1 T”是,则“cv2 T指针”类型的prvalue可以转换为类型为“cv2 T指针”的prvalue   更多cv - 合格而不是“cv1 T”。