我有以下课程:
class Blub
{
public:
Blub(int value); // Not a copy constructor!
Blub(Blub&&) = default; // This line is necessary because move constructor is not added automatically
Blub& operator=(Blub&&) = default; // Does not work!?
// Disallow copy
Blub(Blub const &) = delete;
Blub& operator=(Blub const &) = delete;
};
由于一些奇怪的原因,我不得不强制移动构造函数。 现在试图强制移动赋值运算符G ++(4.6.1)chokes with: error:'Blub& Blub :: operator =(Blub&&)'不能默认
可悲的是,没有为什么。任何人都可以解释为什么会失败
解决方案: 实际上我使用dragonegg插件生成llvm代码。禁用dragonegg并使用普通的g ++,默认工作正常。 查看g ++的源代码无法默认(带有移动分配)消息是4.5(module.c)中的一个错误,但在4.6中得到修复。由于dragonegg确实依赖于g ++ 4.5,我怀疑该修复程序还没有。长号。
答案 0 :(得分:4)
当显式声明复制构造函数或复制赋值运算符时,你必须强制移动构造函数,即使你= default
它,C ++ 11也不会定义移动构造函数或者为您分配操作员。标准第12.8节(第9和20段)解释了未宣布这些标准的规则。
至于为什么默认移动构造函数不起作用,我猜这是因为Other
不支持移动操作。