第7章 语言 7.5.4 右值引用

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;
}

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值