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 中,v.insert(v.end(), new int(1));被优化为调用std::vector::emplace_back哪个构造对象,而 std::vector::push_back 将尝试复制/转换int*std::unique_ptr<int>然后它失败。要将智能指针推送到 STL 容器中,您可以指定确切的类型:

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 回答