# V811. Decreased performance. Excessive type casting: string -> char * -> string.

Анализатор обнаружил код, который потенциально можно оптимизировать. В коде присутствует избыточное создание объекта типа 'std::string', от которого можно избавиться.

У объекта класса 'std::string' с помощью функции 'c_str()' берется указатель на массив символов. Затем из этих символов конструируется новый объект типа 'std::string'. Например, это возможно, если неоптимальное выражение является:

- аргументом вызова функции;
- операндом оператора присваивания;
- операндом оператора 'return'.

Рассмотрим пример для случая с вызовом функции:

    void foo(const std::string &s)
    {
      ....
    }
    ....
    void bar()
    {
      std::string str;
      ....
      foo(str.c_str());
    }

Улучшить код очень просто - достаточно убрать вызов метода 'c_str()'. Рассмотрим пример упрощенного кода:

    ....
    void bar()
    {
      std::string str;
      ....
      foo(str);
    }

Пример некорректного кода для оператора присваивания будет иметь вид:

    std::string str;
    ....
    std::string s = str.c_str();

Пример некорректного кода для оператора 'return' будет иметь вид:

    std::string foo(const std::string &str)
    {
      ....
      return str.c_str();
    }

Исправить ошибку в этих случаях следует аналогично случаю для вызова функции.