将字符串字面值分配给char*

6
以下代码在C++0x中是合法、不推荐或非法的?
答案:在C++0x中,以下代码是合法的。
char* p = "foobar";

我最初在这里留下了一个评论,询问与C++字符串相关的问题。


3
它继续运作,但仍保持糟糕的风格。 - Ben Voigt
GCC 4.6 提示“从字符串常量转换为char *已弃用”。 - Kerrek SB
好的,更准确地说应该是 const char* - Marius Bancila
2个回答

14

转换

char* p = "foobar";

在C++98/C++03中,"abc"字符串字面值可以被转换为指向char类型的右值指针;而宽字符串字面值则可以被转换为指向wchar_t类型的右值指针。无论哪种情况,结果都是指向数组第一个元素的指针。当有显式的适当指针目标类型时才考虑此转换,而不是一般需要从左值转换为右值。该转换已被弃用,在C++0x中已被删除(即§4.2/2已被删除)。

因此,在C++0x中,这段代码无效

然而,MinGW g ++ 4.4.1仍只发出警告,而不是错误。


即使使用带有“-std=c++0x”的g++ 4.4.5也只会发出警告。 - Fred Foo
所以§4.2/2最初是关于字符串字面值到char*转换的,我想?如果可能的话,能否引用C++03标准中的该段落将会很酷 :) - fredoverflow
1
@Fred:我添加了来自C++03的段落。@Alf:我希望这对您没有问题。 - sbi
@Alf:实际上,我是直接从C++03标准中复制的,而不是从C++98标准中复制的。如果你确定它与C++98中的相同,那么你的更改不会有影响,但如果它已经被更改了,那么现在就是错误的。 - sbi
@sbi:在原始的C++98中是一样的。 - Cheers and hth. - Alf
1
+1,我已经重新检查了标准,它确实将这视为C和C++之间的差异:§C.1.1 [diff.lex]包含示例:char* p = "abc"; // legal in C, illegal in C++。更改的基本原理是:这可以避免调用不适当的重载函数,该函数可能希望能够修改其参数。 - David Rodríguez - dribeas

2
我相信在C++0x中,这种转换现在是被禁止的。C++03为遗留代码提供了一个特殊的警告,但C++0x已经删除了它,现在你正在违反const正确性。
当然,我不知道是否有真正的编译器已经删除了它,但它们完全有权这样做。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接