右值引用的作用

右值引用

自从引入了这个右值引用之后,我们把之前通常叫的引用称为左值引用。

  • 不同
    左值引用:我们之前所说的别名
    右值引用:大部分时间和左指引用一样,但是有一点区别,他能够绑定到临时变量(右值)
A a;
A&& a_rref = a;
A&& temp_rref = A();
  • 作用
    (1)避免拷贝,提高性能,实现move()
    (2)避免重载参数的复杂性,实现forward()

Move Semantics

第一个作用,就不多说了

Perfect Forwarding

第二个作用,参考[2]

// 1.struct A没有const引用的构造函数
class A {
public:
    A(int a) : num(a){}
    A(A& a) : num(a.num) {}
    //A(const A& a) : num(a.num) {}
    A& operator=(A const & rhs) { return *this; }; // classical implementation
    A& operator=(A&& rhs);
private:
    int num;
};
// 2. factory 版本
// factory1
template <class T>
std::shared_ptr<T>
factory()   // no argument version
{
    return std::shared_ptr<T>(new T);
}
// factory2
//template <class T, class A1>
//std::shared_ptr<T>
//factory(const A1& a1)   // one argument version
//{
//    return std::shared_ptr<T>(new T(a1));
//}
// factory3
//template <class T, class A1>
//std::shared_ptr<T>
//factory(A1& a1)
//{
//    return std::shared_ptr<T>(new T(a1));
//}
// factory4
template <class T, class A1>
std::shared_ptr<T>
factory(A1&& a1)
{
    return std::shared_ptr<T>(new T(std::forward<A1>(a1)));
}

// 3.编译报错
            A* q = new A(5);
    std::shared_ptr<A> p = factory<A>(5);
    p = factory<A>(*q);

在calss A没有const引用的拷贝构造函数的情况下,结果是:
(1)如果factory的const引用参数这个版本(factory2)没有的话,那么*std::shared_ptr<A> p = factory<A>(5);*就会报如下错

error C2664: 'std::shared_ptr<_Ty> factory<A,int>(A1 &)' : cannot convert parameter 1 from 'int' to 'int &'

(2)如果factory的非const引用参数这个版本(factory3)没有的化,那么*p = factory<A>(*q);*这句就会报错

error C2558: class 'A' : no copy constructor available or copy constructor is declared 'explicit'

所以,这里就引出了一个问题,如果factory的参数有很多的化,那么重载函数的数量就指数增长了。右值的作用就发挥在这里了,factory4就只需要一个就搞定了

参考

[1]rvalue references
[2]A Brief Introduction to Rvalue References

C++11中,右值引用作用之一是实现移动语义,即对象的资源所有权的转移。在C++11之前,移动语义的缺失是C++所面临的一个问题。右值引用也可以看作是一块空间的别名,只能引用右值。通过使用右值引用,我们可以对右值进行引用,并且可以实现对移动语义的支持。右值引用的语法是在类型后面加上两个&&。在函数返回值为临时变量的情况下,可以使用右值引用来接收该临时变量。另外,右值引用还可以引用经过move操作后的左值,通过使用move函数,可以改变左值的属性,使其变成右值。总之,右值引用在C++中的作用主要是支持移动语义,提高程序的性能和效率。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [c++的右值引用具体用法](https://download.csdn.net/download/weixin_38734492/14887141)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [C++11——右值引用](https://blog.csdn.net/weixin_57023347/article/details/120957689)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值