初始化一个以shared_ptr为值的const映射

Initialize a const map which has shared_ptr as values

本文关键字:const 映射 ptr 一个以 shared 初始化      更新时间:2023-10-16

我正在尝试创建一个const映射,其中键为int,第二个值为类的shared_ptr。

比方说,我有一个类a,B,C从a派生。我想能够创建一个地图

const map<int, shared_ptr<A>> mymap

并使用以下值初始化映射:

{1, new B()} and {2, new C()}

但使用初始值设定项列表会产生错误。我该怎么做有什么帮助吗?

问题是您试图从原始指针隐式构造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段要求接受原始指针为explicit:的shared_ptr<>的构造函数

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

问题是,您试图通过将原始指针作为第二个参数传递给接受shared_ptr<A>pair<>的构造函数来构造std::pair<int, 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>()}
    };