如何解决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 举报,一经查实,本站将立刻删除。