C++ C++;初始化嵌套映射中的唯一\u ptr,编译错误?

C++ C++;初始化嵌套映射中的唯一\u ptr,编译错误?,c++,initialization,move,unique-ptr,initializer-list,C++,Initialization,Move,Unique Ptr,Initializer List,我知道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>

我知道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, map<int, unique_ptr<int>>> d; // 3, workaround
    d.try_emplace(1, move(map<int, unique_ptr<int>>{})); // 4 workaround
}
#包括
#包括
#包括
使用名称空间std;
int main()
{
映射a{};//1,确定
映射b{{1,{};//2,错误,已访问副本
映射d;//3,解决方法
d、 尝试部署(1,移动(映射{}));//4解决方法
}
在第1行到第4行中,只有第2行无法编译,我认为这意味着可以访问unique_ptr的copy ctor

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>]’
错误:使用已删除函数“std::unique\u ptr::unique\u ptr(const std::unique\u ptr&)[带_Tp=int;_Dp=std::default\u delete]”
但我根本不想在这里实例化一个唯一的\u ptr。我可以接受这样的理论,即第1行只是调用默认的ctor,因此这不是一个比较好的参考,但在第2行中,我只是实例化一个空的内部映射对象,它不应该实例化一个唯一的_ptr

我对初始值设定项列表的有限理解是涉及到复制ctor(可能不止一次?)。但是,在本例中,Inner映射不应该初始化为空映射,因此不应该调用unique_ptr的ctor吗


顺便说一句,我的解决方法是第3行和第4行,到目前为止它们似乎可以工作,但仍然想了解第2行失败的原因。

难道
map
也不可复制吗?我认为问题一定是
std::map
的构造函数尝试将条目复制到map中,该构造函数使用
初始值设定项列表
参数,无论是对于版本1还是版本2,这显然在这里都不起作用。如果您试图像在版本2中那样使用
初始值设定项列表构建
a
,请参见@Frank的链接。编译器生成的代码不关心传递的映射是否包含任何条目。它需要能够处理任何
映射
。代码生成基于类型信息,而不是数据。所以情况也是一样:在初始值设定项列表中初始化一个具有非复制可构造类型的映射。@QnA as as as as as is_copy_constructible去: