C++ 未生成隐式移动函数

C++ 未生成隐式移动函数,c++,llvm,c++11,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 w

我有以下课程:

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)阻塞:错误:“Blub&Blub::operator=(Blub&&)”不能默认

可悲的是,没有理由。有人能解释一下为什么这是失败的吗

解决方案: 实际上,我使用dragonegg插件生成llvm代码。禁用dragonegg并使用普通g++时,默认设置可以正常工作。
查看g++的源代码,在4.5(module.c)中,不能默认(使用移动分配)消息是一个bug,但在4.6中得到了修复。?。由于dragonegg确实依赖于g++4.5,我怀疑修复程序还没有启动。糟糕。

当您明确声明复制构造函数或复制赋值运算符时,必须强制移动构造函数,即使您
=default
它,C++11也不会为您定义移动构造函数或赋值运算符。本标准第12.8节(第9段和第20段)解释了未声明的规则


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

我没有默认复制函数-我删除了它们(应该有区别;)。@LCID:standard只允许隐式移动构造函数/赋值操作符,如果类,“没有用户声明的副本构造函数“。为了删除副本构造函数,您必须声明它。老实说,如果你足够关心复制/移动行为以明确删除复制构造函数,那么你就足够关心显式默认移动构造函数。我不同意,但必须显式默认函数对我来说是可以的(强制编写一些难看的定义,但不管怎样)。但真正的问题是——移动构造函数正在工作/编译,而移动赋值操作符没有。我不明白为什么。@LCID Fire:因为为遗留代码(在C++0x之前编写)生成移动构造函数/赋值不应该产生任何意外结果。因为实验表明,有缺陷的行为可以以各种方式引入(没有人能说出确切的条件是什么),委员会采取了谨慎的方法,只是简单地说,只要你摆弄复制/分配,就不会自动生成移动构造函数/分配。