Iva*_*son 4 c++ language-lawyer
一般而言,文字是prvalues.字符串是一种特殊情况,定义为char(意义lvalue)数组.这个问题具体是关于字符串文字.
为什么不使用非字符串文字const?
foo(42); // passes foo an `int`, not a `const int`.
Run Code Online (Sandbox Code Playgroud)
你不能修改非字符串文字,所以它不是有意义的const吗?
文字答案可能是因为文字早于const语言的添加,所以自然不是const.
但实际的答案是 - constprvalues从根本上说是奇怪的事情.您不能从任何基本类型创建它们,但您可以拥有const类型的prvalue.但为什么?通常情况下,我们会const采取措施防止进一步修改.但是,如果它是一个prvalue,它甚至不是一个有身份的东西 - 谁会在那里观察它的无意识修改?constprvalues阻止移动 - 因为它们是const,所以你不能从它们移动,所以它是一个过早的悲观.
请注意,语言已明确禁止可能出错的一件事,即假设的const文字会阻止这一点:
void foo(int&);
foo(42); // error
Run Code Online (Sandbox Code Playgroud)
但是42 const,语言使得左值引用const不允许绑定到右值.
请记住,默认情况下 C++ 是按值传递的,这意味着值会被复制。
无法修改像 42 这样的数字文字值,因为您拥有的只是变量中的副本。文字值本身甚至不必存储在内存中,编译器可以直接在生成的代码中使用它。