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