C++中使用字符串字面值的const正确性

13
根据C++标准,字符串字面值类型是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?

能否请您解释一下,为什么在第三行我没有收到错误提示?


1
@Rapptz 我似乎找不到C++11标准中允许相同“向后兼容转换”的条款。我猜它已经被删除了,所以链接的问题现在不是重复的。 - Angew is no longer proud of SO
因为相较于破坏成千上万现有程序,让它像历史上一样被允许更可取。 - Ed S.
3
@Rapptz,关于C语言的问题和答案怎么会与关于C++语言的问题重复呢?特别是在两种语言实际上存在区别的领域。 - Angew is no longer proud of SO
@Angew 因为在这个上下文中它们的区别并不像你想象的那么大。 - Rapptz
2个回答

14

历史原因。曾经允许并且非常普遍的做法是将一个字符串字面量分配给char*,尽管字符串字面量的类型是一个const char数组。我认为这源自于C的早期时期,当时还不存在const,但请不要引用我说过的话。后来这种做法被弃用了,但仍然允许使用,以不破坏使用它的代码库。但这种允许并不包括从const char*(或不是字面量的const char数组)初始化char*,这就是为什么你的第二行会失败的原因。在C++11中,禁止从字符串字面量到char*的转换,但你的编译器可能还没有强制实施。


12

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

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


illformeddeprecated 的 C++11。并非无效。由于历史原因,这仍然可以编译。在此处查看不带 -Wall在此处查看带有 -Wall -Werror - Rapptz
7
@Rapptz的意思是“illformed”和“invalid”是等价的,即“不合法”的意思。 - Benjamin Lindley
2
@Rapptz 注意,illformed不等于deprecated,*"deprecated"的东西可以工作但不被鼓励使用,而"illformed"(以及Benjamin所说的"invalid"*)的东西则无法工作。 - Christian Rau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接