以下代码在 C++0x 中是否合法、已弃用或非法?
char* p = "foobar";
我最初在这里提出这个问题作为评论。
转换
char* p = "foobar";
在 C++98/C++03 中已弃用,并且在 C++0x 中已被删除(即 §4.2/2 被删除)。
因此,该代码在 C++0x 中无效。
但是,MinGW g++ 4.4.1 仍然只发出警告,而不是错误。
C++98/C++03 §4.2/2(在 C++0x 中被删除):
不是宽字符串文字的字符串文字(2.13.4)可以转换为类型为“pointer tochar
”的右值;宽字符串文字可以转换为“pointer towchar_t
”类型的右值。无论哪种情况,结果都是指向数组第一个元素的指针。仅当存在显式适当的指针目标类型时才考虑这种转换,而不是当一般需要从左值转换为右值时。[注意:此转换已弃用。见附录 D。] 为了在重载决议 (13.3.3.1.1) 中排序,这种转换被认为是数组到指针的转换,然后是限定转换 (4.4)。【例子:"abc"
先转换为”pointer toconst char
”作为数组到指针的转换,再转为”pointer tochar
”作为资格转换。]
我相信这在 C++0x 中现在是非法的。C++03 对遗留代码的这种转换有一个特殊的警告,但是 C++0x 删除了它,现在你违反了 const 正确性。
当然,我不知道是否有任何真正的编译器已将其删除,但他们将在他们的权利范围内。