为什么可以将char char*分配给char*?

Ale*_*Dan 15 c++ string char literals

我知道例如"hello"是类型const char*.所以我的问题是:

  1. 我们如何分配像"hello"这样的非字符串const char*:

    char* s = "hello";  // "hello" is type of const char* and s is char*
                        // and we know that conversion from const char* to
                        // char* is invalid
    
    Run Code Online (Sandbox Code Playgroud)
  2. 是一个文字字符串"hello",它将在我的所有程序中占用内存,或者就像临时变量在语句结束时会被销毁?

Kon*_*lph 24

事实上,"hello"是类型char const[6].

但问题的要点仍然是正确的 - 为什么C++允许我们将只读内存位置分配给非const类型?

唯一的原因是向后兼容旧的C代码,这是不知道的const.如果C++在这里一直很严格,它会破坏很多现有的代码.

也就是说,大多数编译器都可以配置为警告这些代码已弃用,甚至默认情况下这样做.此外,C++ 11完全不允许这样做,但编译器可能还没有强制执行它.


对于Standerdese粉丝:
[参考1] C++ 03标准:§4.2/ 2

不是宽字符串文字的字符串文字(2.13.4)可以转换为"指向字符的指针"的右值; 可以将宽字符串文字转换为"指向wchar_t的指针"类型的右值.在任何一种情况下,结果都是指向数组第一个元素的指针.仅当存在明确的适当指针目标类型时才考虑此转换,而不是在通常需要从左值转换为右值时.[ 注意:此转换已弃用.见附录D.]为了在重载决策(13.3.3.1.1)中进行排序,这种转换被认为是一个数组到指针的转换,然后是一个限定转换(4.4).[示例:"abc"转换为"指向const char的指针"作为数组到指针的转换,然后转换为"指向char的指针"作为限定转换.]

C++ 11简单地删除了上面的引用,这意味着它是C++ 11中的非法代码.

[参考2] C99标准6.4.5/5"字符串文字 - 语义":

在转换阶段7中,将值为零的字节或代码附加到由字符串文字或文字产生的每个多字节字符序列.然后使用多字节字符序列初始化静态存储持续时间和长度的数组,该数组足以包含序列.对于字符串文字,数组元素的类型为char,并使用多字节字符序列的各个字节进行初始化; 对于宽字符串文字,数组元素的类型为wchar_t,并使用宽字符序列进行初始化...

如果这些数组的元素具有适当的值,则这些数组是否不同是未指定的.如果程序试图修改此类数组,则行为未定义.

  • @Als你采取了简单的做法,让它变得丑陋.;-)但是谢谢.我实际上也想添加它,但我根本无法在我的C++ 11草案中找到相关的段落.2.14.3确实定义了类型,附件指定了转换的无效性,但没有任何表明它已被弃用但在C++ 03中有效. (2认同)