6

以下代码在 C++0x 中是否合法、已弃用或非法?

char* p = "foobar";

我最初在这里提出这个问题作为评论。

4

2 回答 2

14

转换

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 to char”的右值;宽字符串文字可以转换为“pointer to wchar_t”类型的右值。无论哪种情况,结果都是指向数组第一个元素的指针。仅当存在显式适当的指针目标类型时才考虑这种转换,而不是当一般需要从左值转换为右值时。[注意:此转换已弃用。见附录 D。] 为了在重载决议 (13.3.3.1.1) 中排序,这种转换被认为是数组到指针的转换,然后是限定转换 (4.4)。【例子:"abc"先转换为”pointer to const char”作为数组到指针的转换,再转为”pointer tochar”作为资格转换。]

于 2011-06-27T12:13:26.163 回答
2

我相信这在 C++0x 中现在是非法的。C++03 对遗留代码的这种转换有一个特殊的警告,但是 C++0x 删除了它,现在你违反了 const 正确性。

当然,我不知道是否有任何真正的编译器已将其删除,但他们将在他们的权利范围内。

于 2011-06-27T12:10:08.317 回答