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