Анализатор обнаружил ситуацию, в которой возможно лишнее копирование при объявлении переменной.
Рассмотрим пример:
void foo(const std::vector<std::string> &cont) { for (auto item : cont) // <= { std::cout << item; } }
В цикле 'for' происходит обход контейнера, содержащего элементы типа 'std::string'. Согласно правилам вывода результирующий тип переменной 'item' будет 'std::string'. Из-за этого на каждой итерации будет происходить копирование элемента контейнера. Можно также заметить, что в теле цикла не происходит модификаций переменной 'item'. Следовательно, лишнего копирования можно избежать. Для этого надо заменить тип 'auto' на 'const auto &'.
Исправленный пример:
void foo(const std::vector<std::string> &containter) { for (const auto &item : containter) // <= { std::cout << item; } }
Рассмотрим второй пример:
void use(const std::string &something); void bar(const std::string &name) { auto myName = name; use(myName); }
В этом случае также лучше заменить 'auto' на 'const auto &', так как 'myName' в теле функции не модифицируется. Исправленный пример:
void use(const std::string &something); void bar(const std::string &name) { const auto &myName = name; use(myName); }