C2280-尝试引用已删除的函数是尝试从initializer_list构造std :: map>时遇到的错误
我已经做了最简单的代码来表示我的问题:
#include <string>
#include <map>
#include <memory>
using namespace std;
int main() {
map<string, unique_ptr<int>> MyMap{
{ "first" ,make_unique<int>(6) },
{ "second",make_unique<int>(22) },
{ "third" ,make_unique<int>(86) }
};
}
因此,我意识到无法复制unique_ptr,但是由于make_unique返回一个右值,因此不应该将unique_ptr移到initializer_list中吗?顺便说一句,如果我用shared_ptr替换了unique_ptr,那么问题就解决了,但不是我想要的解决方案,我想保留该初始化样式和unique_ptr。那么,什么时候才发生对删除函数的问题调用呢?有没有一种方法可以编译它而无需替换unique_ptr?
可悲的是,这是std::initializer_list
对象的局限性之一。它们仅提供const
对元素的访问,因此无法移出它们。最好的选择是用老式的方式初始化地图。
map<string, unique_ptr<int>> MyMap;
MyMap["first"] = make_unique<int>(6);
// etc.
如果需要将地图设为const
,则可以创建一个临时地图并从中移动:
const map<string, unique_ptr<int>> myMap = [] {
map<string, unique_ptr<int>> m;
m["first"] = make_unique<int>(6);
// etc.
return m; // RVO or implicit move
}();
您还可以使用的范围构造函数std::map
,但是您必须为此自己编写一个特殊的迭代器类型,这会很烦人。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句