表达式的分类图:
glvalue: generalized lvalue, 广义左值,包含lvalue和xvalue
rvalue: 右值,包含xvalue和prvalue,因可能出现在表达式右侧得名
lvalue: 左值,因可能出现在表达式右左侧得名
xvalue: eXpiring value, 具有生命周期的值,涉及对象引用
prvalue: pure rvalue,只能出现在赋值表达式右侧的值,如字符串常量、基本类型值
右值(RValue)区分于左值(Lvalue),形如:
lvalue = rvalue/pValue/xvalue);
或
lvalue; //如果是函数则按照返回类型判断,引用类型是左值,值类型是右值
左值的特点:
右值的特点:
例子:
#include
using namespace std;
int main()
{
string sLV1 = "C++"; //sLV1是左值,10是右值prvalue
string sLV2 = sLV1; //sLV2是左值,sLV1是右值xvalue
int iLV1 = 100; //iLV1是左值,100是右值prvalue
int *pLV2 = & iLV1; //pLV2是左值,&iLV1右值xvalue
return 0;
}
左值引用即我们以往说的引用,是一个别名,类似于指针,通常左值引用只能绑定左值且可以延长临时对象的生存期:
int main()
{
int iLV1 = 100; //iLV1是左值,100是右值prvalue
int &rLV2 = iLV1; //rLV2是左值引用
return 0;
}
右值引用使用的符号是&&,右值引用只能绑定右值,且可以延长临时对象的生存期,
int main()
{
int iLV1 = 100;
int && pLV2 = iLV1 + 100; //pLV2是右值引用,右值(iLV1 + 100)作为临时变量绑定到pLV2
return 0;
}
ISO/IEC N3690 - 3.10 Lvalues and rvalues
Microsoft 左值和右值
C++ 参考手册
引用一次解释为绑定更为容易理解,右值引用通过将一组临时变量绑定到一个新的变量上,绑定该新变量但不销毁这组临时变量,所以并不需要分配内存和复制,新变量自然就延长了生命周期。此时,规定该类型为右值引用,类似左值却可以和左值区分开来,