其实"hello"
是类型char const[6]
。
但问题的要点仍然是正确的——为什么 C++ 允许我们将只读内存位置分配给非const
类型?
唯一的原因是向后兼容旧的 C 代码,它不知道const
. 如果 C++ 在这里很严格,它会破坏很多现有的代码。
也就是说,大多数编译器都可以配置为警告此类代码已弃用,甚至默认情况下这样做。此外,C++11 完全不允许这样做,但编译器可能还没有强制执行。
对于 Standerdese 粉丝:
[参考 1] C++03 标准:§4.2/2
不是宽字符串文字的字符串文字(2.13.4)可以转换为“pointer to char”类型的右值;宽字符串文字可以转换为“指向 wchar_t 的指针”类型的右值。无论哪种情况,结果都是指向数组第一个元素的指针。仅当存在显式适当的指针目标类型时才考虑这种转换,而不是当一般需要从左值转换为右值时。[注意:此转换已弃用. 见附录 D。] 为了在重载决议 (13.3.3.1.1) 中排序,这种转换被认为是数组到指针的转换,然后是限定转换 (4.4)。[示例:“abc”转换为“pointer to const char”作为数组到指针的转换,然后转换为“pointer to char”作为限定转换。]
C++11 只是删除了上面的引用,这意味着它是 C++11 中的非法代码。
[参考 2] C99 标准 6.4.5/5“字符串文字 - 语义”:
在翻译阶段 7 中,将一个字节或值为零的代码附加到由一个或多个字符串文字产生的每个多字节字符序列。然后使用多字节字符序列来初始化一个静态存储持续时间和长度刚好足以包含该序列的数组。对于字符串字面量,数组元素的类型为 char,并使用多字节字符序列的各个字节进行初始化;对于宽字符串文字,数组元素的类型为 wchar_t,并使用宽字符序列进行初始化...
如果它们的元素具有适当的值,则未指定这些数组是否不同。如果程序尝试修改这样的数组,则行为未定义。