繁体   English   中英

建构std :: map时发生错误 <T, unique_ptr<S> &gt;来自initializer_list

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM