3

次のようなコードがあります

vector<unique_ptr<int>> v;
v.insert(v.end(), new int(1)); // this is okay
v.push_back(new int(1)); // this is wrong, cannot convert int* to unique_ptr<int>&&

コンパイル (vc2010) で違いが表示されるのはなぜですか? ありがとう。

4

1 に答える 1

3

これは、VS2010では、std :: vector :: push_backがコピー/変換を試みたときに失敗したときに、どのコンストラクトオブジェクトv.insert(v.end(), new int(1));を呼び出すように最適化されているためです。スマートポインタをSTLコンテナにプッシュするには、正確なタイプを指定できます。std::vector::emplace_backint*std::unique_ptr<int>

v.insert(v.end(), unique_ptr<int>(new int(1))); 
v.push_back(unique_ptr<int>(new int(1))); 

または単に電話する

v.emplace_back(new int(1));

VS2010とVS2012でコードをテストしましたが、VS2012では許可されていませんv.insert(v.end(), new int(1));が、emplace_backはどちらの場合でも機能します。

于 2013-01-12T03:31:20.783 に答える