2017-06-08 1 views
0

私は、クライアントが2つのメソッドを使ってコンポーネントを追加できるようにするマネージャクラスを用意しています。引数なしでコンポーネントを作成し、もう1つはrvalueを取ります(クライアントコンポーネントのコンストラクタ)。make_sharedを使用したコピーコンストラクションの防止

ここに私が思い付いたコードは次のとおりです。

のstd ::常にをmake_sharedオブジェクトをコピーは、構築
template <class TComponent> 
std::shared_ptr<TComponent> AddComponent() 
{ 
    return AddComponent(TComponent{ this }); 
} 

template <class TComponent> 
std::shared_ptr<TComponent> AddComponent(const TComponent &&obj) 
{ 
    auto ptr = std::make_shared<TComponent>(obj); 
    vec.push_back(ptr); 
    return ptr; 
} 

私が持っている問題であること。この現象を防ぐ方法はありますか? 私は完全なフォワーディングについて読んだが、ここでは役に立たないようだ。

答えて

2

私は完璧な転送について読んでいますが、ここでは役に立たないようです。

私はそれがなぜないかわかりません。

単に移動の構築を可能にするのconstを削除し、std::forwardを追加します。今すぐ

template <class TComponent> 
std::shared_ptr<TComponent> AddComponent(TComponent &&obj) 
{ 
    auto ptr = std::make_shared<TComponent>(std::forward<TComponent>(obj)); 
    vec.push_back(ptr); 
    return ptr; 
} 

、右辺値が移動されます。あなたが避けることができないLvaluesがコピーされます。

+0

申し訳ありませんが、私は完璧な転送を適用しようとしました。だから、 'manager.AddComponent (TestComponent {&manager、0.5f})'の 'TestComponent {&manager、0.5f}'がrvalueであると思っていると誤解していますか?上記のコードとあなたの投稿のコードでは、まだコピーコンストラクタがmake_sharedから呼び出されています。 – Aer

+1

@Aerはい、それは右辺値です。コピーコンストラクタは 'TestComponent'クラスが移動できない場合に呼び出されます。それを確認しましたか?いずれにせよ、[mcve]の作成をお勧めします。 – user2079303

+0

あなたは正しいです!問題は私の例でした:私はコピーコンストラクタを実装し、移動コンストラクタは実装していませんでした。移動コンストラクター生成のルールを調べると、ユーザーが宣言したコピーコンストラクターがない場合に限り、コンパイラーはそれを生成したことを思い出しました。私の一部にはばかなことがあります!ご協力いただきありがとうございます。 – Aer

関連する問題