7.5.4 右值引用
#include <iostream>
using namespace std;
void test1()
{
int a = 100;
int b = 50;
int c = a + b; //编译通过,a+b的和会先存储到一个临时对象_T_,然后再存储到c
}
void test2()
{
int a = 100;
int b = 50;
// int& c = a + b; //编译不通过,如果通过,c处境危险。因为c和临时对象_T_是一体了,但是本体_T_很快就会消亡。
//C++的让步的底线是:允许有名字的常量易用附体到无名的临时数据。
int const& c = a + b; //引用c的存在将为存储“a+b”结果的临时变量_T_延续生命。
}
void foo(int& i) //入参是非常量引用,所以调用时不能传递表达式
{
}
void foo_c(int const& i)//入参是常量引用,它可以附体到无名的临时数据,并有效延续对方的生命周期。
{
}
void test3()
{
int a = 100, b = 50;
// foo(a + b); //ERROR! "a + b"计算结果天生是常量
foo_c(a + b); //foo_c的入参是常量引用,可以附体到无名的临时数据,并有效延续对方的生命周期。
}
int main()
{
cout << "Hello world!" << endl;
return 0;
}
#include <iostream>
using namespace std;
void test1()
{
int a = 100, b = 50;
int&& c = a + b; //c是右值引用
cout << "c =" << c << endl; //150
cout << "a + b = " << a + b << endl;
c = 99; //可以修改
cout << "c = " << c << endl;
cout << "a + b = " << a + b << endl;
}
int foo()
{
return 0;
}
void test2()
{
int a, c, c1, d;
//右值引用,就是专门用于附体到某个右值的引用。什么叫右值,粗浅地说就是赋值操作符“=”右边的值。
a = 10; //10此时是右值
c = c1 + 2; //“c1 + 2”的结果此时是右值
d = foo(); //“foo()”返回的结果此时是右值
/*在函数调用时,编译器会产生某些无名的临时数据,这些数据也经常是赋值操作中的右值。
而右值引用主要就是为这些匆匆产生又匆匆消亡的数据“续命”;更现实和残酷一点,是“夺命”或“鹊巢鸠占”,
中性叫法是“转移(move)”。正是因为夺命,所以右值引用只能用在那些“将死”的右值上,不能用在左值身上,
所谓左值也不一定就是赋值操作符左边的值,而是值那些独立的,有名有姓的(有变量或常量名),生命周期还
挺长的家伙,为什么,因为人家获得好好的,不让“夺”*/
int abc = 9;
int&& rr1 = abc * 2; //OK “abc*2”的计算结果存储于某个无名,临时(短命)的右值上,rr1成功从该右值上抢到命,
//int&& rr2 = abc; //ERROR rr2却失败了,因为abc的生命周期还在(活得好好的),不允许这样被转移到rr2身上去。
}
int main()
{
test1();
return 0;
}