C++11右值引用简介

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zxc024000/article/details/80753090

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;
  • 右值引用:使用右值引用,可以避免上述问题所产生的不必要的开销,
// 如果用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;
}
  • 右值引用还有很多的用法,以及延伸知识,网上有很多资料,可以深入了解。

猜你喜欢

转载自blog.csdn.net/zxc024000/article/details/80753090