Представьте, что у меня есть класс A
, который дешево перемещать и дорого копировать. Это может выглядеть как
class A {
public:
[...]
private:
HeavyClass m;
};
Для этого класса я бы хотел, чтобы статическая проверка заключалась в том, что класс (1) движется конструктивно и (2) не просто использует конструктор копирования для перемещения конструкции, независимо от того, явно ли объявлен конструктор перемещения или нет.
Возможно ли это?
Что касается того, почему я хотел бы этого, рассмотрим следующий пример: сначала класс автоматически генерирует конструктор перемещения и ведет себя по желанию. Затем кто-то меняет класс и добавляет деструктор, из-за чего конструктор перемещения не должен быть неявно сгенерирован, а вместо него используется конструктор копирования.
Следовательно, a static_assert
было бы идеальным, но кажется, что ни один из is_move_constructible
или is_trivially_move_constructible
не полезен здесь.
Кроме того, я знаю, что для всех таких классов возможно иметь A(A&&) = default;
, но решение с static_assert
было бы более чистым и позволяло выполнять проверку вне определения класса (fi в других проектах, основанных на этом класс).
ИЗМЕНИТЬ:
Я не хочу запрещать создание копии, я просто хотел бы убедиться, что конструктор перемещения не использует его...