V822. Decreased performance. A new object is created, while a reference to an object is expected.

Анализатор обнаружил, что скорее всего хотели создать ссылку на объект, а не новый объект. Создание нового ненужного объекта может отнимать время и память.

Рассмотрим код, где справа привели переменную к ссылке, но при этом слева в объявлении её не указали:

auto test = static_cast<NotPOD &>(npod);

В приведенном примере в правой части содержится приведение к ссылке на тип NotPOD, однако в левой части его нет. Из-за этого мы копируем объект вместо ожидаемой передачи по ссылке.

Есть два варианта как можно улучшить этот код. Первый – это заменить auto на decltype(auto):

decltype(auto) test = static_cast<NotPOD &>(npod);

Теперь квалификатор '&' будет выводиться в соответствии с правой частью, но это достаточно громоздко, поэтому можно вручную добавить квалификатор:

auto &test = static_cast<NotPOD &>(npod);

Если же копирование было действительно необходимо, тогда стоит убрать квалификатор из правой части, чтобы увеличить читаемость кода:

auto test = static_cast<NotPOD>(npod);

Найденные ошибки

Проверено проектов
381
Собрано ошибок
13 764

А ты совершаешь ошибки в коде?

Проверь с помощью
PVS-Studio

Статический анализ
кода для C, C++, C#
и Java

goto PVS-Studio;