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

时间:2015-07-22 18:55:03

标签: c++ c++11 c++14

C ++ 11 Standard指定不应为声明析构函数的类生成自动生成的移动构造函数,但以下内容 代码段构建并正确运行:

#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进行构建。我错过了什么吗?

2 个答案:

答案 0 :(得分:4)

初始化使用隐式定义的 copy 构造函数。通常,当移动构造函数或移动赋值运算符由于某种原因而无法使用时,移动将始终回退到副本,因为始终声明复制构造函数和复制赋值运算符(尽管在某些情况下可以删除它们)。 p>

答案 1 :(得分:3)

Brian的回答已经解释了为什么你的代码会编译。要正确检查移动ctor是否被禁止,只需将不可复制的对象放入您的班级,例如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&amp;)'        C c2 = std :: move(c1);