让一个类不可复制和不可移动
Make a class non-copyable *and* non-movable
在c++ 11之前,我可以使用这个来使一个类不可复制:
private:
MyClass(const MyClass&);
MyClass& operator=(const MyClass&);
在c++ 11中,我可以这样做:
MyClass(const MyClass&) = delete;
MyClass& operator=(const MyClass&) = delete;
当使用带有删除的复制和赋值的类时,是否有可能生成默认的move操作符?而且这个类并没有完全复制,而是移动了(这有点类似)?
那么,我必须这样做来防止默认的移动构造和分配吗?MyClass(MyClass&&) = delete;
MyClass& operator=(MyClass&&) = delete;
…div ?
正如其他人在评论中提到的那样,在c++ 11中引入了已删除的构造函数。为了回答你的问题,以下规则一般成立:
- 两个拷贝操作是独立的。声明复制构造函数并不能阻止编译器生成拷贝赋值,反之亦然。(与c++ 98相同)
- 移动操作不是独立的。声明其中任何一个都可以防止编译器生成另一个。(与复制操作不同)
- 如果声明了任何复制操作,则不会生成任何移动操作。
- 如果声明了任何移动操作,则不会生成任何复制操作。 如果声明了析构函数,则不会生成任何move操作。为了与c++ 98反向兼容,仍然会生成复制操作。
- 仅在未声明构造函数时生成的默认构造函数。(与c++ 98相同)
根据评论的要求,这里有一些来源(c++ 11是N3242草案):
- 复制操作:§12.8.8,§12.8.19
- 移动操作:§12.8.10,§12.8.21
- 默认构造函数:§12.1.5
在声明复制构造函数时不会生成移动构造函数/赋值。
MyClass(MyClass&&) = delete;
MyClass& operator=(MyClass&&) = delete;
不需要。
您仍然可以添加它以更明确
相关文章:
- 简单可复制与可简单复制
- reinterpret_cast,只读访问,简单的可复制类型,会出什么问题?
- 对于参加可复制和可移动类的访问者来说,应该有多少过载?
- 可变参数宏:无法通过"..."传递非平凡可复制类型的对象
- 为什么 std::atomic<std::string> 会给出微不足道的可复制错误?
- 我可以隐式地创建一个琐碎的可复制类型吗
- 是std::memcpy在不同的可复制类型之间的未定义行为
- 为什么一对常量是微不足道的可复制的,而对不是?
- 在一个微不足道的可复制结构中,移动语义应该实现吗?
- 可靠地知道卷是否可使用 WinApi 移动
- 防止作用域枚举可复制/可移动
- C :对象上的可复制视图
- 防御性地应用 std::move 到平凡可复制的类型是否不可取
- C++复制可克隆层次结构中的构造函数和赋值
- 如何使具有包含唯一指针的成员变量的类可复制可分配
- 使用 std::string 参数和不可移动/可复制参数构建 std::map
- 如何返回一个不可移动(但可复制)的对象
- 使用 libtool 测试类是否可复制可构造
- visual C++标准是否要求自己的迭代器是另一个可移动/可复制的
- 类Logger是可复制和可移动的,这有意义吗?