Объявленные пользователем пустые деструкторы предотвращают автогенерацию конструкторов перемещений и операторов назначения перемещений
Этот дефект возникает, когда определение класса содержит определяемый пользователем деструктор, имеющий пустой или =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++ |
| По умолчанию: Откл. |
Синтаксис командной строки:
EMPTY_DESTRUCTOR_DEFINED |
| Воздействие: Низкий |