繁体   English   中英

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

[英]Where in the C++11 Standard does it say that char* p = “abc”; is ill-formed?

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

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

更改 :字符串文字使const

字符串文字的类型从“ char of char ”更改为“ const char数组。” 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字符串文字也称为窄字符串文字。 窄字符串文字的类型为“ n const char数组 ”,其中n是下面定义的字符串大小,并且具有静态存储持续时间(3.7)。

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

如果“ cv2 T ”比“ cv1 T更加cv cv2 T则可以将类型“指向cv1 T指针”的prvalue转换为“指向cv2 T指针”的cv1 T

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM