[C++基础]C++右值和左值
测试类A:
私有成员两个int型变量,三个构造函数:默认构造,带参构造,复制构造。
1 class A{ 2 private: 3 int val1; 4 int val2; 5 public: 6 A(){ 7 cout<<"constructor call"<<endl; 8 } 9 A(int a,int b):val1(a),val2(b){ 10 cout<<"constructor(2 para) call"<<endl; 11 } 12 A(const A &a){ 13 this->val1=a.val1; 14 this->val2=a.val2; 15 cout<<"copy constructor call"<<endl; 16 } 17 18 int getVal1() const { 19 return val1; 20 } 21 22 int getVal2() const { 23 return val2; 24 } 25 };
其他函数:
第1行:右值引用版本的getAR。
第7行:普通引用版本的getAL。
line14&15:a对象接收了初始化列表{1,-1}产生的右值,而a是左值,因而调用getA的普通版本。
line16:初始化列表{1,-1}产生右值,调用getA的右值引用版本。
getA()中返回的是一个{},也是一个右值,但return后的值都被左值接收了。
line17可以通过编译而line18会报错,原因就是return {}的是一个右值,必须调用getAR(右值引用版本)。
1 A getAR(A&& para){ 2 cout<<"receive para(rvalue):"<<para.getVal1()<<", "<<para.getVal2()<< endl; 3 return {2,-2}; 4 } 5 6 7 A getAL(A& para){ 8 cout<<"receive para(lvalue):"<<para.getVal1()<<", "<<para.getVal2()<< endl; 9 return {2,-2}; 10 } 11 12 13 int main(){ 14 A a {1,-1}; 15 auto r1 = getAL(a); 16 auto r2 = getAR({2,-2}); 17 getAR(getAL(a)); 18 // getAL(getAL(a)); 19 }