﻿# 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' вместо того, чтобы передать их по значению:

```cpp
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;
  };
};
```

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

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

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

```cpp
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;
  };
};
```