Согласно стандарту,
Если определение класса 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;
}
Таким образом, кажется, что удаленная функция считается определяемой пользователем, что имеет смысл (это не стандартная реализация). Тем не менее, в этом конкретном случае, как удалить конструктор/присвоение конструктора переходов/конструктора беспорядка копирования?
Я думаю, что этот вопрос имеет практическое значение, потому что ручная генерация и особенно. поддержание таких функций по умолчанию является склонным к ошибкам, в то время как (праведное) увеличение использования классов, таких как std::unique_ptr
в качестве членов класса, делало не скопируемые классы гораздо более распространенными животными, чем они были раньше.