std::映射,只有move构造函数可用

std::map with only move constructor available

本文关键字:构造函数 move 只有 映射 std      更新时间:2023-10-16

我有一个带有私有构造函数(我的容器类可以访问(、已删除的复制构造函数和默认的移动构造函数的类。如何在std::map中使用它?

class Item {
public:
Item(const Item&) = delete;
private:
friend class Storage;
Item(int value);
};
class Storage {
public:
void addItem(int key, int value) {
// what to put here?
}
private:
std::map<int, Item> items_;
};

使用emplace(key, Item(value))不起作用,因为它试图复制构造项。std::move中的包裹项目具有相同的效果。使用piecewise_construct不起作用,因为映射(或对(试图使用普通构造函数,这是私有的。

我有一个类,它有私有构造函数(我的容器类可以访问(、已删除的复制构造函数和默认的移动构造函数。

错误,您没有默认的移动构造函数。如果你声明了一个复制构造函数,你就不会得到一个隐式的移动构造函数。您需要显式默认move构造函数才能获得一个:

class Item {
public:
Item(const Item&) = delete;
Item(Item&&) = default;
// Might be a good idea to declare the two assignment operators too
Item& operator=(const Item&) = delete;
Item& operator=(Item&&) = default;
private:
friend class Storage;
Item(int value);
};

现在你可以使用:

items_.emplace(key, Item(value));

例如插入条目。

相关文章: