根据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行我没有收到错误吗?
答案 0 :(得分:14)
历史原因。过去允许并且非常常见,从字符串文字分配到char*
,即使字符串文字的类型是const char数组。我相信它来自C
中const
不存在char*
的日子,但不要引用我的话。它后来被弃用了,但仍然允许这样做以免破坏使用它的代码库。允许量不会扩展到允许const char*
从char*
初始化(也不会从不是文字的const char数组),这就是你的第二行失败的原因。在C ++ 11中,禁止从字符串文字到{{1}}的转换,但您的编译器可能还没有强制执行。
答案 1 :(得分:12)
在C ++ 03中,有一个特殊规则([conv.array]§2)允许将字符串文字转换为char*
类型。
在C ++ 11中,此规则不再存在。换句话说,您的代码是有效的C ++ 03,但无效的C ++ 11。