提问者:小点点

禁止拷贝操作是否会自动禁止移动操作?[重复]


我想编写一个没有任何复制和移动语义的C类:我只对它的构造函数和析构函数感兴趣。

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

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

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

作为测试,我尝试在类实例上调用< code>std::move(),似乎没有自动生成移动操作,因为Visual Studio 2015 C编译器会发出错误消息。

这是特定于 MSVC 2015 的行为,还是由 C 标准规定的,即通过 =delete 复制操作禁用会自动禁用移动构造函数和移动赋值?


共2个答案

匿名用户

在这种情况下,MSVC符合标准。[class.copy]C 14中的/9如下:

如果类< code>X的定义没有显式声明移动构造函数,当且仅当

    < li>X没有用户声明的复制构造函数, < li>X没有用户声明的复制赋值运算符, < li>X没有用户声明的移动赋值运算符,并且 < li>X没有用户声明的析构函数。

因此,您的类没有移动构造函数,任何移动它的尝试都将退回到已删除的复制构造函数。

匿名用户

虽然布莱恩可能已经给了你关心的信息,但让我试着多补充一点(或者只是以一种没人关心的方式对措辞变得迂腐)。

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

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