この質問は unique_ptr をクラス メンバーとして組み合わせており、コンストラクターで clangおよびC++ std::vector を使用してムーブ セマンティクスをコンパイルできません。
私の目標はラッパーを構築することです
struct V_wrapper{
std::vector<std::unique_ptr<AClass> > vec;
V_wrapper(std::vector<std::unique_ptr<AClass> > v) : vec{std::move(v)} {}
};
v
残念ながら、このコードはコンパイルできません。コンパイラ (clang Apple LLVM バージョン 4.2)が、サポートされていないベクターをコピーして構成しようとするためです。一方、 の中間ラッパーを設計するとstd::unique_ptr<AClass>
、次のようになります。
struct P_wrapper{
std::unique_ptr<AClass> Ptr;
P_wrapper(std::unique_ptr<AClass>& p) : Ptr(std::move(p)) {}
};
V_wrapper を次のように記述します。
struct V_wrapper{
std::vector<P_wrapper > vec;
V_wrapper(std::vector<P_wrapper > v) : vec{std::move(v)} {}
};
それから私は問題ありません。これが機能する理由は、ベクトルのコンストラクターが、クラスメンバーとしての unique_ptr と移動セマンティクスが clang でコンパイルに失敗するのと同じように、コピーを試みるのではなく参照を使用して移動する必要があることを認識するためだと思います (強調) 。
std::vector<std::unique_ptr<AClass> >
残念ながら、これは、私が を作成し、それを使用して を作成しP_wrapper
、最後にそれを使用して を作成するというかなり不便な作成手順につながりますV_wrapper
。真ん中のステップは完全に冗長であるべきだと思います!さらに、インターフェイスが読みにくくなります。そもそもラッパーの全体的なポイントはvec
、ユーザーからの実装を隠すことでしたが、現在、P_wrapper
別のオブジェクトを構築するためにのみ使用される不可解な (ソースコードを知らない) オブジェクトがあります....
これを避けたいので、ラッパーは 1 つしかありません。最初のはるかに単純な実装に戻ることができるように、仲介者を切り取る方法はありV_wrapper
ますか?