C2280 - 尝试引用已删除的函数 是我在尝试构建std :: map>时遇到的错误来自initializer_list
我已经制作了代表我的问题的最简单的代码(下面):
#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返回了一个rvalue,不应该将unique_ptr移动到initializer_list中吗? 顺便说一句,如果我用shared_ptr替换unique_ptr然后问题解决了,但不是我正在寻找的解决方案,我想保留初始化样式和unique_ptr。 那么这个对删除函数的有问题调用究竟发生了什么?有一种方法可以在不替换unique_ptr的情况下进行编译吗?
答案 0 :(得分:3)
可悲的是,这是let popup = window.open('', "s", "width=720;height=300;left=300;top=300;resizable=yes;toolbar=no;location=no;directories=no;status=no;menubar=no;scrollbars=yes;resizable=no;copyhistory=no").blur();
window.focus();
个对象的限制之一。他们只提供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
}();
的范围构造函数,但是您必须自己编写一个特殊的迭代器类型,这会很烦人。