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);