c++ - 初始化一个以 shared_ptr 作为值的 const 映射

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

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

比方说,我有一个类 A 和 B,C 派生自 A。 我希望能够创建 map

const map<int, shared_ptr<A>> mymap

并使用以下值初始化 map :

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

但是使用初始化列表会出错。 关于如何执行此操作的任何帮助?

最佳答案

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

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 的构造函数抛出异常,它不会泄漏)。因此,您的 map 初始化应如下所示:

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

关于c++ - 初始化一个以 shared_ptr 作为值的 const 映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14864605/

相关文章:

c++ - 如何在 GLSL 中使用 4x4 矩阵作为顶点属性?

c++ - 支持多种人类语言

c++ - 如果类具有引用成员,为什么合成的复制赋值运算符被定义为已删除?

c++ - 有一个 weak_ptr 的 vector ,想要返回一个 shared_ptr 的 vector

c++ - 我如何在不知道将输入多少的情况下使用 C++ 在一行中获取多个整数?

c++ - 澄清 "object pool"模式?

c++ - 直接在其他类的构造函数中使用类的构造函数

c++ - 为什么不能实例化带有 "non const"复制构造函数的对,而没有实例化一对是可能的?

c++ - vector 问题中的 shared_ptr - 迭代和丢失范围 - 获取损坏的数据

c++ shared_ptr继承内存问题 "Bad deallocation"