[笔记]右值引用

右值引用

左值和右值

C++中,左值指的是表达式结束后仍然存在的持久化对象,右值是表达式结束后就不在存在的临时对象。所有的具名变量都是左值,而右值不具名。

简单区分左值和右值:左值能够取到地址,而右值不能。

int i = 0;    // i是左值,0是右值

class Widget;

W getWidget()
{
    return Widget();
}

Widget w = getWidget();   // w是左值,getWidget()返回值是右值

左值引用和右值引用

int i = 0;      // i是左值,0是右值
int& refI = i;  // refI是左值引用,是i的别名

int&& a = 1;   // a是右值引用,实际上是将不具名的变量取了个别名
int&& b = i;    // 不正确,不能将左值复制给右值引用

class Widget;

W getWidget()
{
    return Widget();
}

Widget&& w = getWidget();   // getWidget()返回值是右值

getWidget()的返回的右值本来在表达式结束后,其生命就该结束了,然后通过右值引用,该右值获得了新生,其生命周期将与右值引用变量类型w一致。但要记住,w是一个左值!

左值引用只能绑定左值,右值引用只能绑定右值。常量左值引用即可以绑定左值,也可以绑定右值。

const int& i = 0;    // 常量左值引用绑定右值

class Widget;

W getWidget()
{
    return Widget();
}

const Widget& w = getWidget();   // 常量左值引用绑定右值
Widget& w = getWidget();         // 错误,左值引用不能绑定右值

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