V836. Expression's value is copied at the variable declaration. The variable is never modified. Consider declaring it as a reference.
Анализатор обнаружил ситуацию, в которой возможно лишнее копирование при объявлении переменной.
Рассмотрим пример:
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);
}