13

根据 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?

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

4

2 回答 2

14

历史原因。过去允许并且非常普遍地将字符串文字分配给 a char*,即使字符串文字的类型是 const char 的数组。我相信它来自不存在的日子Cconst但不要引用我的话。它后来被弃用,但仍然允许,以免破坏使用它的代码库。该允许不会扩展到允许char*const char*(也不是从非文字的 const char 数组)初始化,这就是您的第二行失败的原因。在 C++11 中,禁止从字符串文字转换char*为,但您的编译器可能尚未强制执行。

于 2013-03-12T07:13:06.420 回答
12

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

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

于 2013-03-12T07:20:39.753 回答