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