Ответ 1
Это связано с тем, что наличие явно определенного деструктора предотвращает неявное генерирование конструктора перемещения для A
.
В абзаце 12.8/9 стандарта С++ 11:
Если определение класса X явно не объявляет конструктор перемещения, он будет объявлен неявным образом как по умолчанию, если и только если
- X не имеет объявленного пользователем конструктора копирования,
- X не имеет объявленного пользователем оператора назначения копирования,
- X не имеет объявленного пользователем оператора назначения перемещения,
- X не имеет объявленного пользователем деструктора и
- конструктор перемещения не будет явно определен как удаленный.
Теперь без конструктора перемещения, чтобы вернуть значение из f()
, компилятор попытается вызвать неявно созданный конструктор копирования (который все еще создается для обратной совместимости). Однако std::unique_ptr
не копируется. Следовательно, ошибка.
Явное определение конструктора перемещения (или объявление его как дефолтного, как предложено juanchopanza в комментариях) устранит проблему.