2016-09-27 26 views
2

の暗黙的に削除されたコピーコンストラクタを呼び出すと、std::vector<std::unique_ptr<A> >を引数とするオブジェクトを作成しています。コンストラクタはこのエラー: 'std :: __ 1 :: unique_ptr <A、std :: __ 1 :: default_delete <A>>'

class B { 
    std::vector <std::unique_ptr<A> > e_; 

public: 
    B(std::vector <std::unique_ptr<A> > e) : e_(std::move(e)){} 

}; 

のように定義され、その後、

std::vector <std::unique_ptr<A> > e; 
B b(e); 

として使用し、Xcodeは私がstd::move()を使用していますにもかかわらず、なぜエラーがまだ持続しているエラー

error: call to implicitly-deleted copy constructor of 'std::__1::unique_ptr<A, std::__1::default_delete<A> >' 
:new((void*)__p) _Up(_VSTD::forward<_Args>(__args)...); 
       ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~` 

を提示していますか?

EDIT:B b(e))の代わりにB b(std::move(e))を使用すると、エラーが消えるようですが、moveのロジックを機能の実装に移動する方法はありますか?

+1

サイレント移動は* bad *です。呼び出し元のベクトルから移動する場合は、呼び出し元のコードでベクトルが移動されていることを明確にする必要があります。 –

答えて

0

あなたのコンストラクタ引数は値渡しでコピーを作成しますが、std :: unique_ptrはコピーできません。参照渡しで動作するはずです:

class B { 
    std::vector <std::unique_ptr<float> > e_; 

public: 
    B(std::vector <std::unique_ptr<float> >& e) : e_(std::move(e)){} 

}; 

しかし...私はこれが悪いデザインであるという他のコメントに同意します。あなたがメンバーにBのctorの引数を移動しているので

class B { 
public: 
    std::vector <std::unique_ptr<float> > e_; 
}; 
0

Why is the error still persisting even though i am using std::move()?

:あなたはBeを所有したいが、またBe外を操作したい場合、それは公共のメンバー、不要空想コンストラクタでなければなりませんこれは、変数eが移動されるべきであることを意味するものではありません。

is there any way to move the move logic to the implementation of the function?

でも可能ではありません。コードの読者にとって、eが使用され、移動されたためにもう使用できないことは明らかです。

関連する問題