C++ 左值引用 和 右值引用

C++ 左值引用 和 右值引用

  • 左值、右值是什么?
  • 左值引用
  • 右值引用
  • 参考
  • 总结


左值、右值是什么?

表达式的分类图:

expression
glvalue
lvalue
rvalue
xvalue
prvalue

glvalue: generalized lvalue, 广义左值,包含lvalue和xvalue
rvalue: 右值,包含xvalue和prvalue,因可能出现在表达式右侧得名
lvalue: 左值,因可能出现在表达式右左侧得名
xvalue: eXpiring value, 具有生命周期的值,涉及对象引用
prvalue: pure rvalue,只能出现在赋值表达式右侧的值,如字符串常量、基本类型值

右值(RValue)区分于左值(Lvalue),形如:

lvalue  = rvalue/pValue/xvalue);
或
lvalue; //如果是函数则按照返回类型判断,引用类型是左值,值类型是右值

左值的特点:

  1. 具有可以访问的地址(可取址)
    左值是被赋值的一方,那么它必定有能保存数据值的功能,即有可访问地址(const修饰依然是lvalue)。
  2. 长的生命周期,通常具有变量名
    表达式执行完依然存在,可重复使用,若函数返回引用类型可能没有变量名

右值的特点:

  1. 不具有可访问地址
  2. 临时变量,短周期,不具有变量名

例子:

#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++ 参考手册


总结

引用一次解释为绑定更为容易理解,右值引用通过将一组临时变量绑定到一个新的变量上,绑定该新变量但不销毁这组临时变量,所以并不需要分配内存和复制,新变量自然就延长了生命周期。此时,规定该类型为右值引用,类似左值却可以和左值区分开来,

你可能感兴趣的:(C++,c++)