c – 初始化一个const映射,其中shared_ptr为值
发布时间:2020-12-16 09:42:34 所属栏目:百科 来源:网络整理
导读:我试图创建一个const映射,键为int,第二个值是shared_ptr到类. 比方说,我有一个带有B的A类,而来自A的C. 我希望能够创建一个地图 const mapint,shared_ptrA mymap 并使用值初始化地图: {1,new B()} and {2,new C()} 但使用初始化列表会出错. 有什么帮助我怎么
我试图创建一个const映射,键为int,第二个值是shared_ptr到类.
比方说,我有一个带有B的A类,而来自A的C. 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段要求shared_ptr<>的构造函数接受一个显式的原始指针: template<typename Y> explicit shared_ptr(Y* p); 问题是你正在尝试构造std :: pair< int,shared_ptr< A>>的实例.通过将原始指针作为第二个参数传递给对<>的构造函数,该构造函数接受shared_ptr< A>.基本上,这与以下相同: pair<int,shared_ptr<A>> mymap(1,new B()); // ERROR! pair<int,shared_ptr<B>(new B())); // OK 这就是说,除非你有充分的理由去做其他的并且你真的知道你在做什么,最好还是使用std :: make_shared<>()来创建共享指针,这都是因为效率(它执行一个内存)分配而不是两个)和异常安全(如果B或C的构造函数抛出异常,它将不会泄漏).因此,您的地图初始化应如下所示: const map<int,make_shared<B>()},make_shared<C>()} }; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |