次のようなコードがあります
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) で違いが表示されるのはなぜですか? ありがとう。
次のようなコードがあります
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) で違いが表示されるのはなぜですか? ありがとう。
これは、VS2010では、std :: vector :: push_backがコピー/変換を試みたときに失敗したときに、どのコンストラクトオブジェクトv.insert(v.end(), new int(1));
を呼び出すように最適化されているためです。スマートポインタをSTLコンテナにプッシュするには、正確なタイプを指定できます。std::vector::emplace_back
int*
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はどちらの場合でも機能します。