std::映射,只有move构造函数可用
std::map with only move constructor available
我有一个带有私有构造函数(我的容器类可以访问(、已删除的复制构造函数和默认的移动构造函数的类。如何在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));
例如插入条目。
相关文章:
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 添加自定义析构函数时,Move 构造函数在派生类中消失
- 将向量从 N1 缩小到 N2 项,而不触发默认构造函数并仅使用 move 语义
- 为什么 std::move 不将默认移动构造函数中的源变量更改为默认值?
- std::映射,只有move构造函数可用
- 为什么我的代码中没有调用move构造函数
- std::转换move构造函数的模板专业化的变体
- std::tuple默认构造函数,带有move可构造元素
- 如何调用move构造函数
- 复制初始化:为什么即使关闭了复制省略,也没有调用move或copy构造函数
- 为什么我们需要在构造函数的初始化列表中使用 std::move?
- 在构造函数中初始化成员时,是否应该在成员上使用 std::move?
- 我可以将 std::move 与不提供 move 构造函数的类一起使用吗?
- 基于范围的 std::move 调用意外复制构造函数
- C++编译错误是由于使用 std::move 时运动构造函数与其他非运动构造函数之间的冲突
- 为什么noexcept move构造函数在向量重新分配期间没有被调用
- 使用 Move 语义在构造函数中初始化类成员
- 为什么在声明析构函数时必须声明 copy & move 构造函数?
- 我应该总是在构造函数中使用 std::move 吗?
- 如果我们只定义复制构造函数/oper=,为什么移动构造函数/move赋值没有隐式声明和定义为删除