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;
}
私が持っている問題であること。この現象を防ぐ方法はありますか? 私は完全なフォワーディングについて読んだが、ここでは役に立たないようだ。
申し訳ありませんが、私は完璧な転送を適用しようとしました。だから、 'manager.AddComponent(TestComponent {&manager、0.5f})'の 'TestComponent {&manager、0.5f}'がrvalueであると思っていると誤解していますか?上記のコードとあなたの投稿のコードでは、まだコピーコンストラクタがmake_sharedから呼び出されています。 –
Aer
@Aerはい、それは右辺値です。コピーコンストラクタは 'TestComponent'クラスが移動できない場合に呼び出されます。それを確認しましたか?いずれにせよ、[mcve]の作成をお勧めします。 – user2079303
あなたは正しいです!問題は私の例でした:私はコピーコンストラクタを実装し、移動コンストラクタは実装していませんでした。移動コンストラクター生成のルールを調べると、ユーザーが宣言したコピーコンストラクターがない場合に限り、コンパイラーはそれを生成したことを思い出しました。私の一部にはばかなことがあります!ご協力いただきありがとうございます。 – Aer