C++ 在C++;标准是说char*p=";“abc”;;这是病态的吗?

C++ 在C++;标准是说char*p=";“abc”;;这是病态的吗?,c++,c++11,standards,C++,C++11,Standards,在C++11标准中,它在哪里说char*p=“abc”格式不正确吗 这在C++03中仍然有效(尽管已弃用),但在C++11中情况发生了变化。C++11标准的附录C提到(见C1.1): 更改:生成字符串文本const 字符串文字的类型从“字符的数组字符的数组”更改为“字符的数组常量字符的数组” char16\u tstring literal从“某个整数类型的数组”更改为“const char16\u t的数组” char32\u t字符串文字的类型从“某个整数类型的数组”更改为“const ch

在C++11标准中,它在哪里说
char*p=“abc”格式不正确吗

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

更改:生成字符串文本
const

字符串文字的类型从“字符的数组<代码>字符的数组
”更改为“字符的数组<代码>常量字符的数组”
char16\u t
string literal从“某个整数类型的数组”更改为“const char16\u t的数组”
char32\u t
字符串文字的类型从“某个整数类型的数组”更改为“const char32\u t的数组” 宽字符串文字的类型从“数组的
wchar\u t
”更改为“数组的
const wchar\u 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):

如果启用了“
cv2 T
”,则可以将“指向
cv1 T
”类型的PR值转换为“指向
cv2 T
”类型的PR值 比“
cv1 T
”更多的
cv
-合格的


注意,该标准的示例使用了糟糕的样式。在这种情况下,最好明确指定
const\u cast
@Potatoswatter:是的,我同意在答案中添加8.5/16中的最后一个破折号,我们得到格式错误的语句:否则,被初始化对象的初始值就是初始值设定项表达式的值(可能已转换)。如有必要,将使用标准转换(第4条)将初始值设定项表达式转换为目标类型的cv非限定版本;不考虑用户定义的转换。如果无法完成转换,则初始化格式不正确。@AndyProwl奇怪,但上面定义的函数f()在VS2010中发出以下警告:警告C4717:“f”:在所有控制路径上递归,函数将导致运行时堆栈溢出。@WakeupBrazil确实如此–该示例毫无意义,有点愚蠢。