c++ - 删除复制构造函数和复制赋值运算符。其中哪些是必不可少的?

标签 c++ copy-constructor copy-assignment deleted-functions implicit-methods

我有一个用例,我的对象不能以任何方式复制。我在下面写了一个夸大的复制构造函数和复制赋值运算符删除的完整列表。它们太多了,我无法确定要使用哪些,有时这让我很偏执。我不必将它们全部写在我的代码中,是吗?那么,为了防止任何类型的对象复制,我应该使用哪一个?

        MyClass             (       MyClass &)  = delete;
        MyClass             (const  MyClass &)  = delete;
        MyClass             (       MyClass &&) = delete;
        MyClass             (const  MyClass &&) = delete;
        MyClass    operator=(       MyClass &)  = delete;
        MyClass    operator=(const  MyClass &)  = delete;
const   MyClass    operator=(       MyClass &)  = delete;
const   MyClass    operator=(const  MyClass &)  = delete;
        MyClass &  operator=(       MyClass &)  = delete;
        MyClass &  operator=(const  MyClass &)  = delete;
const   MyClass &  operator=(       MyClass &)  = delete;
const   MyClass &  operator=(const  MyClass &)  = delete;
        MyClass && operator=(       MyClass &)  = delete;
        MyClass && operator=(const  MyClass &)  = delete;
const   MyClass && operator=(       MyClass &)  = delete;
const   MyClass && operator=(const  MyClass &)  = delete;
        MyClass    operator=(       MyClass &&) = delete;
        MyClass    operator=(const  MyClass &&) = delete;
const   MyClass    operator=(       MyClass &&) = delete;
const   MyClass    operator=(const  MyClass &&) = delete;
        MyClass &  operator=(       MyClass &&) = delete;
        MyClass &  operator=(const  MyClass &&) = delete;
const   MyClass &  operator=(       MyClass &&) = delete;
const   MyClass &  operator=(const  MyClass &&) = delete;
        MyClass && operator=(       MyClass &&) = delete;
        MyClass && operator=(const  MyClass &&) = delete;
const   MyClass && operator=(       MyClass &&) = delete;
const   MyClass && operator=(const  MyClass &&) = delete;

最佳答案

您只需将单个复制构造函数和复制赋值运算符标记为delete。复制版本的存在将阻止移动构造函数和移动赋值运算符的隐式声明,并且声明一种形式的复制特殊成员函数会抑制其他形式的隐式声明。

MyClass (const MyClass&) = delete;
MyClass& operator= (const MyClass&) = delete;

请注意,在 C++11 之后,不推荐将赋值运算符隐式定义为默认值,而应将其定义为已删除。

关于c++ - 删除复制构造函数和复制赋值运算符。其中哪些是必不可少的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33776697/

相关文章:

c++ - 在单行上以空格分隔多个输入

c++ - 在 C++ 中使用 STXXL 模板的递归模板函数出错

c++ - 转换 C++ 层次结构以使用静态多态性

c++ - float 子 QMainWindow(QMainWindow 作为主 QMainWindow 的子窗口部件)

c++ - 我定义了一个非拷贝构造函数;复制构造函数是否仍会被隐式定义?

c++ - Gcc 使用 memcpy 作为隐式复制赋值运算符而不是成员复制

C++ 复制构造函数被调用而不是 initializer_list<>

c++ - 在 C++98 中实现移动构造函数和移动赋值运算符以获得更好的性能

c++在派生类中定义复制赋值

c++ - 数组成员的默认复制赋值