自动生成带有声明析构函数的默认移动构造函数

Autogenerated default move constructor with declared destructor

本文关键字:默认 移动 构造函数 析构函数 声明 自动生成      更新时间:2023-10-16

c++ 11标准指定不应该为声明析构函数的类生成自动生成的move构造函数,而是为以下类生成代码片段构建并正确运行:

#include <iostream>
class C
{
public:
    ~C() { std::cout << "Called C:~C" << std::endl; }
private:
    std::string v;
};

int main()
{
    C c1;
    C c2 = std::move(c1);
    return 0;
}

我可以构建clang 4.2.1和gcc 4.4.3。我错过什么了吗?

初始化使用隐式定义的copy构造函数。一般来说,当move构造函数或move赋值操作符由于某种原因不能使用时,move操作总是会返回到复制操作,因为复制构造函数和复制赋值操作符总是被声明的(尽管在某些情况下它们可以被删除)。

Brian的回答已经解释了为什么你的代码可以编译。要正确检查移动因子是否被抑制,只需将不可复制的对象放入类中,例如std::unique_ptr:

class C
{
public:
    ~C() { std::cout << "Called C:~C" << std::endl; }
private:
    std::string v;
    std::unique_ptr<char> p;
};

现在gcc 5.1.0产生这个错误:

错误:使用已删除函数' C::C(const C&) '