Конструктор / назначение перемещения по умолчанию и конструктор / назначение удаленной копии
Согласно стандарту,
Если определение класса X явно не объявляет конструктор перемещения, он будет неявно объявлен как дефолтный, если и только если
- X не имеет объявленного пользователем конструктора копирования,
- X не имеет заявленного пользователем оператора копирования,
- X не имеет объявленного пользователем оператора назначения перемещения, и
- X не имеет объявленного пользователем деструктора.
Теперь следующее не компилируется
# include <utility>
class Foo
{
public:
Foo() = default;
Foo(Foo const &) = delete;
};
int main()
{
Foo f;
Foo g(std::move(f)); // compilation fails here
return 0;
}
Таким образом, кажется, что удаленная функция считается пользовательской, что имеет смысл (это не реализация по умолчанию). Тем не менее, в этом конкретном случае, как бы конструктор / назначение перемещения по умолчанию удалял копию конструктор / назначение?
Я думаю, что этот вопрос имеет практическое значение, потому что ручная генерация и ESP. поддержание таких функций по умолчанию подвержено ошибкам, в то же время (праведное) увеличение использования таких классов, какstd::unique_ptr
поскольку участники класса сделали не копируемые классы гораздо более обычными животными, чем раньше.