删除复制构造函数和复制赋值运算符.哪一项至关重要?

hkB*_*sai 14 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;
Run Code Online (Sandbox Code Playgroud)

Tar*_*ama 23

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

MyClass (const MyClass&) = delete;
MyClass& operator= (const MyClass&) = delete;
Run Code Online (Sandbox Code Playgroud)

请注意,在C++之后的11中,赋值运算符的默认隐式定义已被弃用,而应将其定义为已删除.

  • 只是一个非常轻微的挑剔,我可能是错的.是不是*定义*已弃用,而不是*声明*?它们总是被声明,但它们的定义被删除了.但我不是一个很好的语言律师. (3认同)

Bra*_*him 5

复制构造函数

MyClass             (const  MyClass &)  = delete;
Run Code Online (Sandbox Code Playgroud)

分配经营者

MyClass &  operator=(const  MyClass &)  = delete;
Run Code Online (Sandbox Code Playgroud)

这些是隐式定义的唯一复制构造函数和复制分配运算符.

  • 你的"解决方案"很好,但答案实际上是错误的.正确的推理是所有赋值运算符和构造函数都是隐式定义的,除非出于其他原因,您手动定义它们.删除计为此目的的定义. (4认同)
  • `operator =`不是构造函数; 并且通常可以隐式定义其他构造函数 - 但是用户定义的`MyClass(const MyClass&)`的存在会抑制其他构造函数. (2认同)