右辺値参照の役割

右辺値参照

この右辺値参照の導入以来、左辺値参照と呼ばれていたものを参照してきました。

  • 異なる
    左辺値参照:前述のエイリアス
    右辺値参照:ほとんどの場合、左のガイドと同じですが、違いがあります。一時変数(右辺値)にバインドできます。
A a;
A&& a_rref = a;
A&& temp_rref = A();
  • 関数
    (1)コピーの回避、パフォーマンスの向上、移動の実装()
    (2)オーバーロードされたパラメーターの複雑さの回避、転送の実装()

セマンティクスを移動

最初の役割、私はあまり言いません

完全転送

2番目の役割、[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-referencedコピーコンストラクターがない場合、結果は次のようになります。
(1)ファクトリー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)このバージョン(factory3)でファクトリの非const参照パラメーターが変更されていない場合、* p = factory <A>(* q); *この文はエラーを報告します

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

したがって、ここで問題が発生し、ファクトリのパラメータが大幅に変更されると、オーバーロードされる関数の数が指数関数的に増加します。右辺値の役割はここにあり、factory4はそれを取得するために1つだけ必要です。

参考資料

[1] 右辺値参照
[2 ] 右辺値参照の概要

41件のオリジナル記事を公開 賞賛7 20,000回以上の閲覧

おすすめ

転載: blog.csdn.net/pkxpp/article/details/100146821
おすすめ