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++ 中有效,它与第一个语句有何不同?不还是有害吗?如果是这样,为什么标准说没问题?
原文由 rullof 发布,翻译遵循 CC BY-SA 4.0 许可协议
在 C++03 之前,您的第一个示例是有效的,但使用了已弃用的隐式转换——字符串文字应被视为
char const *
类型,因为您无法修改其内容(不会导致未定义的行为)。从 C++11 开始,已弃用的隐式转换已被正式删除,因此依赖它的代码(如您的第一个示例)不应再编译。
您已经注意到允许代码编译的一种方法:虽然隐式转换已被删除,但 显式 转换仍然有效,因此您可以添加强制转换。但是,我 不会 考虑这种“修复”代码。
真正修复代码需要将指针的类型更改为正确的类型:
至于为什么它在 C++ 中被允许(并且仍然在 C 中):仅仅因为有很多现有代码依赖于隐式转换,并且在标准委员会看来,破坏该代码(至少没有一些官方警告)显然像一个坏主意。