构造std :: map <t,unique_ptr <s =“”>&gt;时出错来自initializer_list

时间:2017-10-07 06:34:48

标签: c++ c++11

C2280 - 尝试引用已删除的函数 是我在尝试构建std :: map&gt;时遇到的错误来自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的情况下进行编译吗?

1 个答案:

答案 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 }(); 的范围构造函数,但是您必须自己编写一个特殊的迭代器类型,这会很烦人。