C++11 标准 (ISO/IEC 14882:2011) 在
§ C.1.1
中表示:
char* p = "abc"; // valid in C, invalid in C++
对于 C++ 来说,这是可以接受的,因为指向字符串文字的指针是有害的,因为任何修改它的尝试都会导致崩溃。但为什么它在 C 中有效?
C++11 还说:
char* p = (char*)"abc"; // OK: cast added
这意味着如果将强制转换添加到第一个语句中,它就会变得有效。
为什么转换使第二条语句在 C++ 中有效?它与第一条语句有何不同?不是仍然有害吗?如果是这样的话,为什么标准说可以呢?
通过 C++03,您的第一个示例是有效的,但使用了已弃用的隐式转换 - 字符串文字应被视为类型
char const *
,因为您无法修改其内容(不会导致未定义的行为) .
从 C++11 开始,已弃用的隐式转换已被正式删除,因此依赖于它的代码(如您的第一个示例)不应再编译。
您已经注意到允许代码编译的一种方法:尽管隐式转换已被删除,但显式转换仍然有效,因此您可以添加强制转换。但是,我不会考虑“修复”代码。 真正修复代码需要将指针的类型更改为正确的类型:
char const *p = "abc"; // valid and safe in either C or C++.
至于为什么它在 C++ 中被允许(并且仍然在 C 中):仅仅因为有很多现有代码依赖于隐式转换,并且破坏该代码(至少没有一些官方警告)显然对标准委员会来说似乎就像一个坏主意。
char *
而不是
const char *
,尽管它通过说实际上不允许修改它来限定它。当您使用强制转换时,您实际上是在告诉编译器您比默认类型匹配规则更了解,并且它使赋值正常。
char data[] = "Testing String";
或
const char* data = "Testing String";
或
char* data = (char*) "Testing String";