隐式移动函数未生成

时间:2011-09-17 10:50:06

标签: c++ llvm c++11

我有以下课程:

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,我怀疑该修复程序还没有。长号。

1 个答案:

答案 0 :(得分:4)

显式声明复制构造函数或复制赋值运算符时,你必须强制移动构造函数,即使你= default它,C ++ 11也不会定义移动构造函数或者为您分配操作员。标准第12.8节(第9和20段)解释了未宣布这些标准的规则。

至于为什么默认移动构造函数不起作用,我猜这是因为Other不支持移动操作。