0

Foo私はを含むという名前の構造を持っていますunique_ptr

struct Foo {
    std::unique_ptr<Bar> pointer;
};

今、私はのインスタンスを保存しようとしてFooいますunordered_map

std::unordered_map<int,Foo> myMap;

マップはコピーコンストラクターを必要とせず、移動コンストラクターのみを必要とするため、技術的にはこれが可能であるはずです。

ただし、マップに要素を挿入できません。

myMap.insert(std::make_pair(3, Foo()));

この行は、Visual C ++ 2010で次のエラーを生成します(私のコンパイラは英語ではないため、私が大まかに翻訳しました)。

error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : unable to access private member declared in 'std::unique_ptr<_Ty>'  
with
[
             _Ty=Foo
]
c:\Softwares\Visual Studio 10.0\VC\include\memory(2347) : see declaration of 'std::unique_ptr<_Ty>::unique_ptr'
with
[
             _Ty=Foo
]
This diagnostic happened in the compiler-generated function 'Foo::Foo(const Foo&)'

そのため、不明な理由で、コンパイラーはFoo移動コンストラクターの代わりにコピーコンストラクターを生成しようとして失敗します。

に置き換えstd::make_pairてみましstd::pair<int,something>たが、うまくいくものが見つかりませんsomething


編集:これは動作します

struct Foo {
    Foo() {}
    Foo(Foo&& other) : pointer(std::move(other.pointer)) {}
    std::unique_ptr<Bar> pointer;
};

しかし、私の実際の構造には多くのメンバーが含まれているため、moveコンストラクターでそれらすべてを記述したくありません。

4

3 に答える 3

1

MSVC10(Visual Studio 2010)は、暗黙の移動コンストラクターをまだ実装していません(暗黙の移動コンストラクターが標準にかなり遅れて導入されたため、驚くことではありません。これについては多くの議論がありました)。それらはMSVC11(まだリリースされていないVisual Studio 2012)にも含まれません。

を使用することをお勧めします=defaultが、それもまだサポートされていません。

于 2012-06-03T13:36:22.703 に答える
0

Visual C++2010は移動コンストラクターをサポートしていないと思います。

于 2012-06-03T12:46:38.770 に答える
-1

C ++ 11移動コンストラクターの最大の利点は、コピーコンストラクターと共存できることです。コピーコンストラクターがなく、C ++標準ライブラリの実装にemplaceサポートがない場合は、明示的に移動するか、ロジックを再実装することで、コピーコンストラクターに移動を実装できます。

これの唯一の欠点は、構造を移動する代わりにコピーしようとしたときにコンパイル時エラーが発生しないことです。これにより、(おそらく)見つけるのに時間がかかる可能性のある微妙な問題が発生する可能性があります。

于 2012-06-03T15:19:45.267 に答える