Бросок операций пересылки может привести к контейнерам STL с помощью соответствующих операций копии
Этот дефект происходит, когда класс явным образом объявляет конструктора перемещения, который пропускает noexcept
спецификатор или имеет noexcept
спецификатор, аргумент которого оценивает к false
. Дефект также происходит, если у явным образом заявленного конструктора перемещения есть бросок (
спецификация исключения (удержанный от использования на C++ 11 и удаленный на C++ 17).type
)
Средство проверки не повышает флаг, если конструктор перемещения неявно объявляется или явным образом объявляется как =default
.
Если операция пересылки может выдать исключения, некоторые контейнеры STL будут использовать операции копии вместо этого и не получать выигрыши в производительности операции пересылки. Например, реализация std::vector::resize
метод использует std::move_if_noexcept
и выполняет операцию пересылки для изменения размеров вектора, только если операция пересылки объявляется noexcept
.
Добавьте noexcept
спецификатор к объявлению конструктора перемещения.
Если конструктор перемещения содержит выражения, которые могут выдать, зафиксировать те выражения. Обнаружить нарушения noexcept
спецификация исключения, используйте средство проверки Noexcept function exits with exception
.
Повышения производительности могут варьироваться на основе компилятора, реализации библиотеки и среды, которую вы используете.
Группа: Производительность |
Язык: C++ |
Значение по умолчанию: Off |
Синтаксис командной строки:
MOVE_OPERATION_MAY_THROW |
Удар: низко |