C++ const正确性与字符串文字

Mir*_*pas 13 c++ const

根据C++标准,字符串文字类型是 array of const char

auto constStr = "aaa";
char* nonConstStr = constStr; //Error here, cannot convert from 'const char *' to 'char *'
char* stillNonConstStr = "aaa"; //Why I don't have error here?
Run Code Online (Sandbox Code Playgroud)

你能解释一下为什么在第3行我没有收到错误吗?

Ben*_*ley 14

历史原因.过去允许并且非常常见,从字符串文字分配给a char*,即使字符串文字的类型是const char数组.我相信它来自于天C,其中const不存在,但不可以引用我这句话.它后来被弃用了,但仍然允许这样做以免破坏使用它的代码库.该容差不会扩展到允许char*const char*(也不是来自不是文字的const char数组)初始化,这就是你的第二行失败的原因.在C++ 11中,char*禁止从字符串文字转换为,但您的编译器可能还没有强制执行.


Rei*_*ica 12

在C++ 03中,有一个特殊规则([conv.array]§2)允许将字符串文字转换为类型char*.

在C++ 11中,此规则不再存在.换句话说,您的代码是有效的C++ 03,但无效的C++ 11.

  • @Rapptz:格式错误==无效. (7认同)
  • @Rapptz小心,*格式错误*!=*弃用*,*"弃用"*事情有效但不鼓励,*"格式错误"*(和*"无效"*,如*本杰明*所说)事情*不*工作. (2认同)