【发布时间】:2018-08-29 12:16:22
【问题描述】:
文字通常是prvalues。
字符串是一种特殊情况,定义为char(意思是lvalue)的数组。
这个问题专门针对 not string 文字。
为什么非字符串文字不是const?
foo(42); // passes foo an `int`, not a `const int`.
您不能修改非字符串文字,所以将其设为 const 是否有意义?
【问题讨论】:
-
您是否想到了一个重要的用例?
-
函数参数上的顶级 const 限定符无论如何都会被丢弃(即
void foo(const int)与void foo(int)相同)。那么它会有什么不同呢? -
不是重复的 - 标题明确排除了字符串文字,所以关于字符串文字的问题字面上不能重复。
-
我真的想不出有什么办法让这个有所作为,除了字面上写
decltype(42)。你能详细说明它会带来什么吗? -
历史事故。在 C 中,您可以修改和不能修改的内容完全取决于所讨论事物的值类别(左值是可修改的,右值不是),但需要注意的是修改字符串文字(左值)是 UB,它是一个类型系统疣。因此,当 C++ 尝试解决此问题时,它会将
const添加到字符串文字的类型中,以使其静态不可修改。其他文字一开始是静态不可修改的,因此没有人认为有必要将它们设为const。
标签: c++ language-lawyer