# V2012. Possibility of decreased performance. It is advised to pass arguments to std::unary_function/std::binary_function template as references.

Данное диагностическое правило добавлено по просьбе пользователей.

В коде обнаружен класс, унаследованный от 'std::unary_function' или 'std::binary_function'. При этом среди параметров его шаблона находятся классы, передаваемые по значению. Очевидно, передача по значению объекта класса (особенно "тяжёлого", с большим количеством полей или сложным конструктором) может повлечь за собой дополнительные расходы по времени и памяти. Конечно, передача объекта по значению не всегда плоха. Передача по значению имеет смысл, если надо сохранить исходный объект и работать с изменённой копией. Но иногда код, в котором происходит передача объекта по значению, получился случайно и является плохим решением.

Рассмотрим пример. Данный функтор при каждом вызове будет копировать два объекта типа 'std::string' вместо того, чтобы передать их по значению:

    class example : public std::binary_function
      <std::string, std::string, bool>
    {
    public:
      result_type operator()(
        first_argument_type first,
        second_argument_type second)
      {
        return first == second;
      };
    };

Разумеется, простейшим решением в данном случае может послужить передача параметров шаблона по ссылке, а не по значению:

    class example : public std::binary_function
      <const std::string &, const std::string &, bool> ....

Анализатор также не выдаст предупреждение, если в теле функции все аргументы, переданные не по ссылке, изменяются:

    class example : public std::binary_function
      <std::string, std::string, bool>
    {
    public:
      result_type operator()(
         first_argument_type first,
         second_argument_type second)
      {
        std::replace(first.begin(), first.end(), 'u', 'v');
        std::replace(second.begin(), second.end(), 'a', 'b');
        return first == second;
      };
    };