我正在尝试创建一个 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<>()
总是更好。创建共享指针,既因为效率(它执行一次内存分配而不是两次)和异常安全(如果 B
或 C
的构造函数抛出异常,它不会泄漏)。因此,您的 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/