vector :: emplace_back与shared_ptr一起使用

时间:2013-11-06 20:39:04

标签: c++

#include <iostream>
#include <vector>
#include <memory>
using namespace std;

struct BinaryTree
{
    int element;    
    shared_ptr<BinaryTree> left;
    shared_ptr<BinaryTree> right;
};

int main()
{
   vector<shared_ptr<BinaryTree>> vecBT;

   // case I
   vecBT.emplace_back(new BinaryTree{10, nullptr, nullptr});

   // case II
   vecBT.emplace_back(shared_ptr<BinaryTree>(new BinaryTree{20, nullptr, nullptr}));

   return 0;
}

http://en.cppreference.com/w/cpp/container/vector/emplace_back
template< class... Args >
void emplace_back( Args&&... args );

http://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr
template< class Y >
explicit shared_ptr( Y* ptr );

问题&GT;我已经通过http://www.compileonline.com/compile_cpp11_online.php编译了上面的代码而没有错误。

我的问题是case I如何在不产生错误的情况下传递编译器。由于shared_ptr的构造函数需要显式构造。所以我希望只有case II是正确的。

1 个答案:

答案 0 :(得分:8)

两种情况都是正确的,std::shared_ptr的构造函数是显式的,但这正是从emplace_back调用的,它只是将其参数转发给显式构造函数调用。这与将std::shared_ptr作为参数并请求隐式转换不同。