int x = 8;
int y = x ;
在这里,左值如何充当右值?我知道这是一个愚蠢的问题,但我只想让我的概念清楚 rvalue 和 lvalue 。
通过左值到右值的转换。
您几乎可以在需要右值的任何地方使用左值,并且会自动进行隐式左值到右值的转换。
非正式地,这种转换是“评估”或“取值”左值所指的对象。并非在所有情况下都严格如此。在未计算的上下文中,例如 的操作数sizeof
,不会使用对象的值。
ISO/IEC 14882:2011 4.1 [conv.lval]:
非函数、非数组类型的 glvalue (3.10)
T
可以转换为纯右值。如果T
是不完整类型,则需要进行此转换的程序格式错误。如果泛左值所引用的对象不是类型对象,T
也不是派生自 的类型的对象T
,或者如果该对象未初始化,则需要此转换的程序具有未定义的行为。如果T
是非类类型,则纯右值的类型是 的 cv 非限定版本T
。否则,纯右值的类型是T
。
左值是可以出现在赋值左侧的任何值。可以分配的东西,例如x
本例中的变量。右值是具有价值的事物,例如8
或获得 的价值x
。您可以将左值视为右值的子集,即所有左值都可以查询其值并将其用作右值。