C/C++ 中“左值”和“右值”的命名背后的原因是什么?
标准中提到了这一点:
左值(历史上如此称呼,因为左值可能出现在赋值表达式的左侧)[...]
右值(历史上如此称呼,因为右值可以出现在赋值表达式的右侧)[...]
也就是说,左值是您可以分配给的东西,右值是您可以从中分配的东西。
然而,这逐渐离事实越来越远。无法分配左值的一个简单示例是const
多变的。
const int x = 5;
x = 6; // Error
当涉及运算符重载时,您甚至可以让右值出现在赋值的左侧。
我发现将左值视为引用存储在内存中的对象并将右值视为只是一个值(可能已从内存中读取)更有用。这些概念很好地反映了这个想法。一些例子:
- 左值到右值可以被认为是从内存中的对象读取值。
- 大多数运算符需要左值到右值的转换,因为它们使用对象的值来计算结果。
- 操作员的地址(
&
) 需要一个左值,因为您只能获取内存中某些内容的地址。它不需要获取对象的值来计算其地址。
- 表演
std::move
将左值表达式转换为右值表达式可以被认为是欺骗编译器认为存储在内存中的对象实际上只是一个临时值。
然而,这也并不适用于所有情况。这只是一个合理的类比。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)