禁止复制操作是否自动禁止移动操作? 我想写一个C++类,没有任何拷贝和移动语义:我只关心它的构造函数和析构函数。< /P>

禁止复制操作是否自动禁止移动操作? 我想写一个C++类,没有任何拷贝和移动语义:我只关心它的构造函数和析构函数。< /P>,c++,c++11,move-semantics,C++,C++11,Move Semantics,我使用C++11的=delete语法显式禁用了复制操作(即复制构造函数和复制赋值运算符),例如: class MyClass { public: MyClass() { /* Init something */ } ~MyClass() { /* Cleanup something */ } // Disable copy MyClass(const MyClass&) = delete; MyClass& oper

我使用C++11的
=delete
语法显式禁用了复制操作(即复制构造函数和复制赋值运算符),例如:

class MyClass 
{
  public:    
    MyClass()  { /* Init something */    }
    ~MyClass() { /* Cleanup something */ }

    // Disable copy
    MyClass(const MyClass&) = delete;
    MyClass& operator=(const MyClass&) = delete;
};

作为一个测试,我尝试在类实例调用<代码> STD::MOVER()/CUT>,并且似乎没有自动生成的操作,因为VisualStudio 2015 C++编译器发出错误消息。


这是一个针对MSVC 2015的行为,还是由C++标准规定的,通过禁用代码>删除/>代码>复制操作自动禁用移动构造函数和移动赋值?C++14中的[class.copy]/9读取:

如果类
X
的定义没有显式声明移动构造函数,则将隐式声明一个移动构造函数 默认为当且仅当

  • X
    没有用户声明的复制构造函数
  • X
    没有用户声明的复制分配运算符
  • X
    没有用户声明的移动分配运算符,并且
  • X
    没有用户声明的析构函数
因此,您的类没有移动构造函数,任何移动它的尝试都会退回到已删除的复制构造函数。

虽然Brian可能已经给了您您所关心的信息,但让我尝试添加多一点(或者可能只是以一种没有人关心的方式对措词学究)

删除复制构造函数或复制赋值运算符可防止编译器隐式合成移动构造函数/移动赋值运算符


不过,您仍然可以自己显式定义移动构造函数和/或移动分配。因此,防止复制实际上并不会阻止移动构造和移动赋值——它只是阻止编译器隐式实现它们。

请参阅:因此,我的“用户声明的析构函数”的存在会阻止移动构造函数的自动(隐式)声明。我想知道拥有一个
=delete
复制构造函数是否算作“用户声明的复制构造函数”。@Mr.C64确实如此。如果需要移动构造函数,可以显式默认它。或者,你可以尝试遵守零的规则。