命名"左值"和"右值"背后的原因是什么?

Pio*_*ioz 0 c c++ terminology rvalue lvalue

在C/C++中命名"左值"和"右值"背后的原因是什么(我知道它们是如何运作的)?

Jos*_*eld 11

标准提到:

左值(所谓的历史,因为左值可能出现在赋值表达式的左侧)[...]

一个右值(所谓的历史,因为右值可能出现在赋值表达式的右侧)[...]

也就是说,左值是你可以分配的东西,右值是你可以分配的东西.

然而,这已逐渐从事实中得到进一步发展.无法分配左值的简单示例是const变量.

const int x = 5;
x = 6; // Error
Run Code Online (Sandbox Code Playgroud)

当涉及运算符重载时,您甚至可以在赋值的左侧显示右值.

我发现将左值作为引用存储在内存中的对象和将右值作为一个值(可能已经从内存中读取)来考虑更有用.这些概念很好地反映了这个想法.一些例子:

  • Lvalue-to-rvalue可以被认为是从内存中的对象读取值.
  • 大多数运算符需要左值到右值的转换,因为它们使用对象的值来计算结果.
  • operator(&)的地址需要左值,因为你只能获取内存中某些东西的地址.它不需要获取对象的值来计算其地址.
  • 执行std::move将左值表达式转换为右值表达式可以被认为是欺骗编译器认为存储在内存中的对象实际上只是一个临时值.

但是,这在任何情况下都不会成立.这只是一个合理的比喻.