4

我正在尝试使用一种方法设置 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:

这个任务有什么问题?

4

1 回答 1

6

std::unique_ptr是不可复制的,因此您不能复制std::map持有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));

或者像这样,使用临时:

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

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

A::A(map<int, unique_ptr<B>> x) 
: x(std::move(x)) {

}
于 2013-06-18T14:13:06.887 回答