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