隐式删除对(const std :: pair< _T1,_T2>&),因为默认定义不正确错误:分配unique_ptr的映射时

时间:2013-06-18 14:11:09

标签: c++ map variable-assignment smart-pointers

我正在尝试使用方法设置unique_ptr的地图。

class A {
    map<int, unique_ptr<B>> x;
public:
    void setx(const map<int, unique_ptr<B>>& x) {this->x = x;} // <-- error
    ...
};

但是,我收到了这个错误。

'constexpr std::pair<_T1, _T2>::pair(const std::pair<_T1, _T2>&) [with _T1 = const int; _T2 = std::unique_ptr<ContextSummary>]' is implicitly deleted because the default definition would be ill-formed:

这项任务有什么问题?

1 个答案:

答案 0 :(得分:4)

std::unique_ptr不可复制,因此您无法复制包含std::map的{​​{1}}。你可以移动它:

unique_ptrs

请注意,为了移动地图,您需要它不是void setx(map<int, unique_ptr<B>> x) { this->x = std::move(x); } 引用,否则您无法移动它。按值取值允许调用者使用临时值或移动左值。

现在,您可以使用这样的代码:

const

或者像这样,使用临时工具:

std::map<int, std::unique_ptr<B>> some_map = ...;
some_a.setx(std::move(some_map));

正如0x499602D2所指出的,您可以直接在构造函数中执行此操作:

some_a.setx({
    {1, make_unique<B>(...)},
    {2, make_unique<B>(...)}
});