右值引用的做用

[TOC]html

右值引用

自從引入了這個右值引用以後,咱們把以前一般叫的引用稱爲左值引用。bash

  • 不一樣

左值引用:咱們以前所說的別名函數

右值引用:大部分時間和左指引用同樣,可是有一點區別,他可以綁定到臨時變量(右值)性能

A a;
A&& a_rref = a;
A&& temp_rref = A();
複製代碼
  • 做用

(1)避免拷貝,提升性能,實現move()ui

(2)避免重載參數的複雜性,實現forward()this

Move Semantics

第一個做用,就很少說了spa

Perfect Forwarding

第二個做用,參考[2].net

// 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引用的拷貝構造函數的狀況下,結果是:code

(1)若是factory的const引用參數這個版本(factory2)沒有的話,那麼*std::shared_ptr<A> p = factory<A>(5);*就會報以下錯htm

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

相關文章
相關標籤/搜索