为什么从字符串常量到'char \*'的转换在C中有效但在C中无效

新手上路,请多包涵

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 许可协议

阅读 840
2 个回答

在 C++03 之前,您的第一个示例是有效的,但使用了已弃用的隐式转换——字符串文字应被视为 char const * 类型,因为您无法修改其内容(不会导致未定义的行为)。

从 C++11 开始,已弃用的隐式转换已被正式删除,因此依赖它的代码(如您的第一个示例)不应再编译。

您已经注意到允许代码编译的一种方法:虽然隐式转换已被删除,但 显式 转换仍然有效,因此您可以添加强制转换。但是,我 不会 考虑这种“修复”代码。

真正修复代码需要将指针的类型更改为正确的类型:

 char const *p = "abc"; // valid and safe in either C or C++.

至于为什么它在 C++ 中被允许(并且仍然在 C 中):仅仅因为有很多现有代码依赖于隐式转换,并且在标准委员会看来,破坏该代码(至少没有一些官方警告)显然像一个坏主意。

原文由 Jerry Coffin 发布,翻译遵循 CC BY-SA 3.0 许可协议

由于历史原因,它在 C 中有效。 C 传统上指定字符串文字的类型是 char * 而不是 const char * ,尽管它通过说实际上不允许修改它来限定它。

当您使用强制转换时,您实际上是在告诉编译器您比默认类型匹配规则更了解,并且它使分配正常。

原文由 Barmar 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题