Неявные функции перемещения не генерируются - PullRequest
4 голосов
/ 17 сентября 2011

У меня есть следующий класс:

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), но было исправлено в 4.6.?.Так как dragonegg действительно зависит от g ++ 4.5, я подозреваю, что исправления еще нет.Облом.

1 Ответ

4 голосов
/ 17 сентября 2011

Вы должны принудительно вызвать конструктор перемещения в любое время, когда вы явно объявляете конструктор копирования или оператор присваивания копии, даже если вы = default его, C ++ 11 не будет определять конструктор перемещения или оператор присваивания для вы. В разделе 12.8 стандарта (пункты 9 и 20) разъясняются правила, когда они не объявляются.

Что касается того, почему конструктор перемещения по умолчанию не работает, я думаю, это потому, что Other не поддерживает операции перемещения.

...