这段代码似乎不起作用,因为唯一的指针被存储到一个pair对象中,然后尝试从中复制。这可以避免吗?
std::unordered_map<std::string,std::unique_ptr<int>> _map {
{"hello", std::make_unique<int>(7)}
};
完整的代码示例和编译错误可以在这里查看http://cpp.sh/7uc3a http://cpp.sh/7uc3a
是的,不使用列表初始化。
std::unordered_map<std::string,std::unique_ptr<int>> _map;
_map.insert({"hello", std::make_unique<int>(7)});
std::unordered_map
需要调用复制或移动构造函数才能将任何键和值存储在其内部缓冲区中。如果是std::unique_ptr
,复制构造函数被删除,因为复制了std::unique_ptr
会让它一点也不独特。只剩下移动构造函数了。
问题在于您如何初始化地图:
std::unordered_map<std::string,std::unique_ptr<int>> _map {
{"hello", std::make_unique<int>(7)}
};
您正在使用以下方式初始化地图的值std::initializer_list
.
From 参考参数 https://en.cppreference.com/w/cpp/utility/initializer_list:
std::initializer_list 类型的对象是一个轻量级代理对象,它提供对类型对象数组的访问const T.
实际上,初始值设定项列表中的所有值都是 const。这意味着你的移动构造函数std::unique_ptr
无法调用,因为移动对象通常需要修改原始实例。自从std::unique_ptr
无法移动,编译器会依靠复制构造函数,这就是为什么它最终会抱怨复制构造函数被删除。
我发布的片段之所以有效,是因为insert
接受非常量std::pair
,这意味着std::unique_ptr
是非常量,并且可以调用其移动构造函数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)