右值引用使用场景和意义

右值引用的使用场景和意义

虽然const左值引用既能接收左值,又能接收右值,但左值引用终究存在短板,而C++11提出的右值引用就是用来解决左值引用的短板的。

C++03 及之前的标准中,右值是不允许被改变的,实践中也通常使⽤ const T& 的⽅式传递
右值。然⽽这是效率低下的做法,例如:
Person get()
{
    Person p;
    return p;
}
Person p = get()

上述获取右值并初始化 p 的过程包含了 Person 3 个构造过程和 2 个析构过程。 这是 C++
受诟病的⼀点,但 C++11 的右值引⽤特性允许我们对右值进⾏修改。 借此可以实现 move
,即从右值中直接拿数据过来初始化或修改左值, ⽽不需要重新构造左值后再析构右值。

左值引用的短板
左值引用虽然能避免不必要的拷贝操作,但左值引用并不能完全避免。

左值引用做参数,能够完全避免传参时不必要的拷贝操作。
左值引用做返回值,并不能完全避免函数返回对象时不必要的拷贝操作。
如果函数返回的对象是一个局部变量,该变量出了函数作用域就被销毁了,这种情况下不能用左值引用作为返回值,只能以传值的方式返回,这就是左值引用的短板。

比如下面我们模拟实现一个int版本的to_string函数,这个to_string函数就不能使用左值引用返回,因为to_string函数返回的是一个局部变量。

代码如下:

namespace cl
{
    cl::string to_string(int value)
    {
        bool flag = true;
        if (value < 0)
        {
            flag = false;
            value = 0 - value;
        }
        cl::string str;
        while (value > 0)
        {
            int x = value % 10;
            value /= 10;
            str += (x + '0');
        }
        if (flag == false)
        {
            str += '-';
        }
        std::reverse(str.begin(), str.end());
        return str;
    }
}

此时调用to_string函数返回时,就一定会调用string的拷贝构造函数。比如:

int main()
{
    cl::string s = cl::to_string(1234);
    return 0;
}

C++11提出右值引用就是为了解决左值引用的这个短板的,但解决方式并不是简单的将右值引用作为函数的返回值。

C++11 ——— 右值引用和移动语义_2021dragon的博客-CSDN博客_c++ 右值引用 移动语义

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值