Во-первых, семантика перемещения помогает только для классов, которые содержат ресурсы любого вида.«Плоские» классы от этого не выигрывают.
Далее, вы должны строить свои классы из «строительных блоков», таких как vector
, unique_ptr
и подобных, которые все имеют дело смельчайшие подробности ресурсов.Если ваш класс сделан так, вам не нужно ничего писать, поскольку компилятор будет правильно генерировать элементы для вас.
Если вам нужно написать деструктор, скажем, для ведения журнала, генерацииПеремещение ctors будет отключено, поэтому вам нужно T(T&&) = default;
для компиляторов, которые его поддерживают.В противном случае, это единственное место, где можно написать такой специальный элемент самостоятельно (ну, кроме случаев, когда вы пишете такой «строительный блок»).
Обратите внимание, что регистрация в деструкторе и конструкторе может быть выполненаболее простой способ.Просто наследуйте от специального класса, который регистрирует строительство / разрушение.Или сделайте его переменной-членом.При этом:
tl; dr Пусть компилятор сгенерирует для вас специальный элемент.Это также учитывает конструктор копирования и оператор присваивания, а также деструктор.Не пишите их сами.
(Хорошо, может быть, операторы присваивания, если вы можете идентифицировать их как «бутылочную горлышко» и хотите оптимизировать их, или если вам нужна безопасность особых исключений или что-то в этом роде.строительные блоки "уже должны предоставить все это.)