make_shared和emplace函数

Mor*_*enn 19 c++ smart-pointers shared-ptr c++11

我试图找到一些简单的方法来安置元素,std::vector<std::shared_ptr<int>>但不能带来任何东西.std::shared_ptr将指针作为参数,所以我仍然可以这样写:

std::vector<std::shared_ptr<int>> vec;
vec.emplace_back(new int(10));
Run Code Online (Sandbox Code Playgroud)

但是,new如果可能的话,我不想手工使用,如果可能的话,我宁愿使用std::make_shared.问题是,如果我真的想要使用它,我必须使用它push_back而失去就地构造的优势:

std::vector<std::shared_ptr<int>> vec;
vec.push_back(std::make_shared<int>(10));
Run Code Online (Sandbox Code Playgroud)

有没有什么办法让两者的优点emplace_backstd::make_shared?如果没有,在这种情况下是否应该遵循指引?

编辑:实际上,我问了这个问题,但有一个无关的问题.Andy的答案是好的,并且使用这两个emplace函数并没有任何实际问题std::make_shared.

And*_*owl 19

您可以让就地移动构造发生:

vec.emplace_back(std::make_shared<int>(42));
Run Code Online (Sandbox Code Playgroud)

  • @Morwenn:这个解决方案确实是函数式的,但我怀疑它等同于push_back,缺点是不那么明确.`emplace`family方法最初用于就地构造值,没有复制或移动(参见[std :: queue :: emplace(...)](http://en.cppreference.com/w/cpp/container/queue/emplace)),允许避免创建临时.当你真的想要从临时(这里发生的事情)复制构造时,我认为`push`系列方法是规范的做事方式.无论如何,编译器可以(或不)删除副本. (5认同)