﻿# V836\. Expression's value is copied at the variable declaration\. The variable is never modified\. Consider declaring it as a reference\.

Анализатор обнаружил ситуацию, в которой возможно лишнее копирование при объявлении переменной\. 

Рассмотрим пример:

```cpp
void foo(const std::vector<std::string> &cont)
{
  for (auto item : cont) // <=
  {
    std::cout << item;
  }
}
```

В цикле 'for' происходит обход контейнера, содержащего элементы типа 'std::string'\. Согласно [правилам вывода](https://en.cppreference.com/w/cpp/language/template_argument_deduction) результирующий тип переменной 'item' будет 'std::string'\. Из\-за этого на каждой итерации будет происходить копирование элемента контейнера\. Можно также заметить, что в теле цикла не происходит модификаций переменной 'item'\. Следовательно, лишнего копирования можно избежать\. Для этого надо заменить тип 'auto' на 'const auto &'\. 

Исправленный пример:

```cpp
void foo(const std::vector<std::string> &containter)
{
  for (const auto &item : containter) // <=
  {
    std::cout << item;
  }
}
```

Рассмотрим второй пример:

```cpp
void use(const std::string &something);

void bar(const std::string &name)
{
  auto myName = name;
  use(myName);
}
```

В этом случае также лучше заменить 'auto' на 'const auto &', так как 'myName' в теле функции не модифицируется\. Исправленный пример:

```cpp
void use(const std::string &something);

void bar(const std::string &name)
{
  const auto &myName = name;
  use(myName);
}
```