【发布时间】:2022-01-13 04:57:19
【问题描述】:
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++11 不允许第一个。我不知道为什么 C 首先将字符串文字
char[]设为类型。第二个是伪装的const_cast。 -
如果更改此规则,将会破坏的遗留 C 代码太多。
-
C 语言在有
const之前就有字符串文字,所以它们不一定是const。 -
C 和 C++ 允许您从几乎任何类型转换为另一种类型。这并不意味着这些演员表是有意义和安全的。
-
更重要的是,这个问题必须源于某种想法,即两种语言的共同点比它们多。错误消息证明这是不正确的,那么为什么您认为询问这两种语言是个好主意,就好像您希望它们有一个共同的子集一样?在那个公共子集中编程是在浪费你的时间。你将依靠两全其美。选择其中一个,当您需要链接来自不同语言的模块时使用链接器。