[英]Error Constructing std::map<T, unique_ptr<S>> from an initializer_list
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
的范围构造函数,但是您必须为此自己编写一个特殊的迭代器类型,这会很烦人。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.