为什么文字不是const(字符串除外)?

时间:2018-08-29 12:16:23

标签: c++ language-lawyer

文学通常是prvalue个。 字符串是一种特殊情况,定义为char(表示lvalue)的数组。 这个问题专门针对非字符串文字。

为什么非字符串文字不是const

foo(42); // passes foo an `int`, not a `const int`.

您无法修改非字符串文字,因此将其设为const并不合理吗?

2 个答案:

答案 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这样的数字文字值,因为您所拥有的只是变量中的一个副本。文字值本身甚至不必存储在内存中,编译器可以直接在生成的代码中使用它。