初始化一个const map,其中shared_ptr为值

时间:2013-02-13 22:38:22

标签: c++ c++11 shared-ptr

我正在尝试使用key创建一个const map作为int,第二个值是shared_ptr到类。

假设我有一个带有B的A类,而C来自A。 我希望能够创建地图

const map<int, shared_ptr<A>> mymap

并使用值

初始化地图
{1, new B()} and {2, new C()}

但是使用初始化列表会出错。 有关如何做到这一点的任何帮助?

1 个答案:

答案 0 :(得分:7)

问题是您正在尝试从原始指针隐式构造shared_ptr。您必须以这种方式初始化地图:

const map<int, shared_ptr<A>> mymap = {
    {1, shared_ptr<B>(new B())}, 
    {2, shared_ptr<C>(new C())}
    };

C ++ 11标准的第20.7.2.2段要求shared_ptr<>的构造函数接受原始指针为explicit

template<typename Y> explicit shared_ptr(Y* p);

问题在于您尝试通过将原始指针作为第二个参数传递给std::pair<int, shared_ptr<A>>的构造函数来构造pair<>的实例,该构造函数接受shared_ptr<A>。基本上,这与:

相同
pair<int, shared_ptr<A>> mymap(1, new B()); // ERROR!
pair<int, shared_ptr<A>> mymap(1, shared_ptr<B>(new B())); // OK

这就是说,除非你有充分的理由去做其他事情并且你真的知道自己在做什么,最好还是使用std::make_shared<>()来创建共享指针,这都是因为效率(它执行一次内存分配)而不是两个)和异常安全(如果BC的构造函数抛出异常,它将不会泄漏)。因此,您的地图初始化应如下所示:

const map<int, shared_ptr<A>> mymap = {
    {1, make_shared<B>()}, 
    {2, make_shared<C>()}
    };