Объявленные пользователем пустые деструкторы препятствуют автогенерации конструкторов перемещения и операторов назначения перемещаются
Этот дефект возникает, когда определение класса содержит определяемый пользователем деструктор, который имеет пустой или =default
реализация и не объявляет как конструктор перемещения, так и оператор назначения перемещения. Для образца:
class aClass { public: ~aClass() noexcept {} // Empty body }; class bClass { public: ~bClass() = default; };
Пустой деструктор не помечен, если:
Деструктор является частным или защищенным.
Деструктор объявлен окончательным.
Деструктор объявлен виртуальным и не переопределяет деструктор базового класса.
Деструктор переопределяет чистый виртуальный деструктор базового класса.
Класс имеет тривиальный конструктор копирования (и поэтому операция копирования не дороже операции перемещения).
Образцы этого класса могут быть излишне скопированы в ситуациях, когда операция перемещения была бы возможна. Операции копирования стоят дороже, чем операции перемещения, и могут повлиять на эффективность.
Попробуйте одно из следующих решений:
По возможности удалите пустой деструктор. Если класс не имеет деструктора, компилятор генерирует деструктор, который по существу является пустым деструктором, который вы явно объявили.
Смотрите также Правило нуля.
Если вы не можете удалить деструктор, добавьте явный конструктор перемещения и переместите оператор назначения в определение класса. Используйте =default
синтаксис, чтобы пояснить, что используются определения компилятора конструкторов перемещения и операторов назначения перемещения.
class aClass { public: ~aClass() noexcept = default; aClass(aClass&& ) = default; aClass& operator=(aClass&& ) = default; };
См. также Правило пяти.
Эффективность улучшения могут варьироваться в зависимости от используемого компилятора, реализации библиотеки и окружения.
Группа: Эффективность |
Язык: C++ |
По умолчанию: Off |
Синтаксис командной строки
: EMPTY_DESTRUCTOR_DEFINED |
Влияние: Низкое |