从初始化列表构造std :: map <T,unique_ptr <S >>时出错

马库斯·阿斯(Marcus Aseth)

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用unique_ptr作为值初始化静态std :: map

在C ++中初始化静态std :: map <int,unique_ptr <int >>

使用unique_ptr作为值初始化const静态std :: map

std :: list <std :: unique_ptr>:空的初始化列表与默认构造函数

是否可以在构造函数的初始化程序列表中初始化std :: unique_ptr的std :: array?

将std :: unique_ptr传递给类时出错

如何初始化std :: unique_ptr <std :: unique_ptr <T> []>?

std :: unique_ptr与std :: map

std :: map初始化程序列表构造函数

std :: unordered_map <T,std :: unique_ptr <U >>是否可复制?GCC错误?

声明包含std :: unique_ptr的结构的std :: vector类时出错

构造unordered_map总是复制unique_ptr

C ++ std :: unique_ptr在std :: map中

从std:unique_ptr隐式转换为布尔值时出错

使用std :: map时,包含unique_ptr的结构中的默认析构函数会导致编译错误

我是否需要在构造函数中显式初始化std :: unique_ptr?

使用std :: map :: at时出错

使用XCode / Clang用std :: shared_ptr实例化std :: map时出错

std :: vector <unique_ptr <class T >>的动态初始化

std :: map的谓词与初始化列表

延迟初始化std :: unique_ptr

无法使用std :: unique_ptr初始化指针

使用初始化列表的vector <unique_ptr <A>>

成员初始化列表中的unique_ptr

如何初始化unique_ptr

从unique_ptr <T []>初始化shared_ptr <T>

当unique_ptr在向量中时,对std :: unique_ptr <>拥有的对象的引用/ ptr是否安全?

初始化std :: unique_ptr作为原始数组指针的初始化

使用std :: unique_ptr <T>&代替std :: unique_ptr <T>有什么优势吗?