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

时间:2013-03-12 07:07: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?

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

2 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:12)

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

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