1

この質問は 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ますか?

4

2 に答える 2

1

ブレース初期化子をむやみに使用しないでください。std::vector初期化子リストを使用するコンストラクターがあります。これを書く明白な方法は、私にとってはうまくコンパイルされます:

#include <memory>    // for std::unique_ptr
#include <utility>   // for std::move
#include <vector>    // for std::vector

struct bar {};

struct foo
{
    using vtype = std::vector<std::unique_ptr<bar>>;
    foo(vtype v) : _v(std::move(v)) { }
private:
    vtype _v;
};
于 2013-07-24T12:04:13.247 に答える
1

デフォルトのコピー コンストラクターと代入演算子を削除する必要があります。これらの関数は暗黙的に定義されており、ベクトルとその内容をコピーしようとするため、明示的に削除する必要があります (これは に対する不正な操作unique_ptrです)。

struct V_wrapper
{
public:
    V_wrapper(std::vector<std::unique_ptr<AClass> > v)
      : vec(std::move(v))
    {}

    // Delete default copy constructor + assignment operator
    V_wrapper(const V_wrapper &) = delete;
    V_wrapper& operator= (const V_wrapper &) = delete;
private:
    std::vector<std::unique_ptr<AClass> > vec;
};
于 2015-01-31T01:14:07.120 に答える