左值右值
左值是指表达式结束后,依然存在的持久化对象,右值是指,表达式结束后,就不再存在的临时对象,有名字的对象都是左值,右值没有名字
还有一种判断方法就是,
class AA {
int m_a;
};
AA getTmp() {
return AA();
}
int main() {
int ii = 3; // ii是左值, 3是右值
int jj = ii+8; // jj是左值, ii+8是右值
AA aa = getTmp(); // aa是左值, getTmp()是右值
return 0;
}
右值引用
右值引用,就是给右值取个名字
语法:
数据类型 && 变量名 = 右值
class AA {
public:
int m_a = 9;
};
AA getTmp() {
return AA();
}
int main() {
int &&i = 3;// 3是右值
int b = 10; // b是左值
int &&c = b+12; // b+12是右值
/**
* getTmp()本来函数返回,返回对象的声明周期就结束了(因为是临时变量),但是使用右值对其引用,因此
* 返回对象的生命周期就和右值的引用对象aa的生命周期相同了,只要aa还活着,该右值临时变量将会一直存活下去
*/
AA &&aa = getTmp(); // getTmp()返回值是右值
cout << i << endl;
cout << c << endl;
cout << aa.m_a << endl;
return 0;
}
一般而言,左值引用只能引用左值,右值引用只能引用右值,但是常量左值引用确是个例外:
int main() {
int a = 4;
const int&ra = a; // a是非常量左值
const int b = 5;
const int&rb = b; // b是常量左值
const int&rc = 1; // 1是右值,这里就是左值引用右值
return 0;
}
网友评论