文学通常是prvalue
个。
字符串是一种特殊情况,定义为char
(表示lvalue
)的数组。
这个问题专门针对非字符串文字。
为什么非字符串文字不是const
?
foo(42); // passes foo an `int`, not a `const int`.
您无法修改非字符串文字,因此将其设为const
并不合理吗?
答案 0 :(得分:5)
字面答案可能是因为字面值早于在语言中添加const
的原因,因此自然地它们不是const
。
但是实际的答案是-const
prvalue从根本上说是奇怪的事情。您不能从任何基本类型创建它们,但是可以具有类类型的const
prvalue。但为什么?通常,我们制作const
来防止进一步的修改。但是,如果这是一个prvalue,那么它甚至都不是具有身份的东西-谁将在那里观察它的意想不到的修改? const
prvalue防止移动-因为它们是const
,所以您不能从它们上移动,因此过早地感到悲观。
请注意,该语言已明确禁止可能出错的情况,即假设的const
文字会阻止这种情况:
void foo(int&);
foo(42); // error
但是,该语言不是使42
const
,而是使左值引用成为非{const
的绑定,不允许绑定到右值。
答案 1 :(得分:3)
请记住,默认情况下,C ++是通过值 传递的,这意味着值是复制的。
无法修改像42这样的数字文字值,因为您所拥有的只是变量中的一个副本。文字值本身甚至不必存储在内存中,编译器可以直接在生成的代码中使用它。