C++ 在嵌套映射中初始化 unique_ptr,编译错误?

问题描述

我知道unique_ptr只能被移动构造和移动分配,但下面的代码仍然让我感到困惑,

#include <map>
#include <memory>
#include <utility>

using namespace std;

int main()
{
    map<int,unique_ptr<int>> a{}; // 1,OK
    map<int,map<int,unique_ptr<int>>> b{{1,{}}}; // 2,error,copy ctor accessed

    map<int,unique_ptr<int>>> d; // 3,workaround
    d.try_emplace(1,move(map<int,unique_ptr<int>>{})); // 4 workaround
}

在第 1 行到第 4 行中,只有第 2 行无法编译,我认为这意味着在某个地方访问了 unique_ptr 的复制构造函数

error: use of deleted function ‘std::unique_ptr<_Tp,_Dp>::unique_ptr(const std::unique_ptr<_Tp,_Dp>&) [with _Tp = int; _Dp = std::default_delete<int>]’

但我根本不想在这里实例化一个 unique_ptr。我可以接受第 1 行只是调用认构造函数的理论,因此它不是一个很好的比较参考,但是,在第 2 行中,我只是实例化了一个空的内部映射对象,它不应该实例化一个 unique_ptr。

我对初始化列表的有限理解是涉及复制构造函数(可能不止一次?)。但是同样,在这个例子中,不应该将内部映射初始化为空映射,因此不应该调用 unique_ptr 的构造函数吗?

顺便说一句,我的解决方法是第 3 行和第 4 行,到目前为止它们似乎有效,但仍然想了解为什么第 2 行失败。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)