C++11右值引用简介

C++11右值引用

  • 最近做的某个项目,由于与国外的某些东西有关。接触到很多C++11、C++14的语法。一方面不时惊叹居然能这么写,另一方面觉得国外的技术确实比国内的发达,至少很多国内觉得新的技术,国外已经应用了许久了。
左值与右值
  • 左值:可以简单理解为,能用在等号左边,也能用在等号右边的值。
  • 右值:可以简单理解为,只能用在等号右边的值。
// 变量a是个左值, 字面量10是个右值。
int a = 10;

// 函数返回值是个左值
int x;
int& getL()
{
    return x;
}

// 函数的返回值,也可以是个右值
int getR()
{
    int y = 10;
    return y;
}
  • 总结:进一步的理解,可以为:
    **左值:**拥有相对稳定的内存,内容可修改(非const)。并且这块内存的内容可反复使用的值。
    **右值:**拥有不稳定的内存,内容不可修改。一般来讲,在使用后该内存即被释放的值(不能反复使用)。
左值引用与右值引用
  • 左值引用:很常见,其实就是C++常说的引用类型
int a = 10;
// 左值引用
int& b = a;

// 形参为左值引用
void fun(int& a)
{
  // somd code
}
  • 为什么要存在右值引用?
    关于这个问题,在知乎上看到过一个比较经典的解释,大概是:

如何把大象从冰箱A放到冰箱B中?
C++:首先,打开冰箱A;启动量子复制程序,复制大象,生成克隆大象。
打开冰箱B。启动量子复制程序,复制克隆大象,将其复制到冰箱B中。
然后,启动销毁程序,清除掉克隆大象。

上述过程,类似C++如下代码

int a = 10int b = a;
// 然后销毁a
  • 右值引用:使用右值引用,可以避免上述问题所产生的不必要的开销,
// 如果用g++编译,请加上 -std=c++1
// 右值引用
int&& rv = 10;
int b = rv;

// 函数返回右值引用
int&& getRvalueInt()
{
	return std::move(b);
}

  • 右值引用:C++11加入了右值引用后,导致类中新增了转移构造函数,这一概念。
Class A
{
    public:
        A() {}
        // 拷贝构造函数
        A(const A& other) {}
        // 转移构造函数
        // 其实,就是把other,当作右值来用,减少了额外的开销
        A(A&& other) {}
    private:
        int* m_Array;
}
  • 右值引用还有很多的用法,以及延伸知识,网上有很多资料,可以深入了解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林多

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值