【发布时间】:2011-09-23 11:01:39
【问题描述】:
【问题讨论】:
-
它继续工作,但风格仍然很差。
-
GCC 4.6 说“不推荐使用从字符串常量到 char* 的转换”。
-
嗯,应该是
const char*,更正确
标签: c++ pointers c++11 deprecated string-literals
【问题讨论】:
const char*,更正确
标签: c++ pointers c++11 deprecated string-literals
转化
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)可以转换为“指向char的指针”类型的右值;宽字符串文字可以转换为“指向wchar_t的指针”类型的右值。无论哪种情况,结果都是指向数组第一个元素的指针。仅当存在显式适当的指针目标类型时才考虑这种转换,而不是当一般需要从左值转换为右值时。 [注意:此转换已弃用。见附录 D。] 为了在重载决议 (13.3.3.1.1) 中排名,这种转换被认为是数组到指针的转换,然后是限定转换 (4.4)。 [示例:"abc"转换为“指向const char的指针”作为数组到指针的转换,然后转换为“指向char的指针”作为限定转换。 ]
【讨论】:
-std=c++0x 的g++ 4.4.5 也只会发出警告。
char* 的转换,我想?如果可能的话,如果您可以将 C++03 标准中的该段落作为引用包含在内,那就太酷了:)
char* p = "abc"; // legal in C, illegal in C++。更改的基本原理是:这样可以避免调用不适当的重载函数,该函数可能期望能够修改其参数。
我相信这在 C++0x 中现在是非法的。 C++03 对遗留代码的这种转换有一个特殊的警告,但是 C++0x 删除了它,现在你违反了 const 正确性。
当然,我不知道是否有任何真正的编译器将其删除,但他们会在他们的权利范围内。
【讨论】: