std::for_each
, как и многие инструменты в библиотеке <algorithms>
, ожидает, что что-то как функция будет передана.Давайте посмотрим на его подпись :
template< class InputIt, class UnaryFunction >
UnaryFunction for_each( InputIt first, InputIt last, UnaryFunction f );
Ожидается, что тип UnaryFunction
будет что-то , который вы можете передать по значению f
, и который выможет вызываться как функция, как в f(value);
Есть пара вещей, которые удовлетворяют этому:
- Указатели на функции
- Объекты Functor, которые являются экземплярамикласс, который перегружает
operator()
- Lambdas (которые на самом деле являются просто объектами-функторами)
Имея это в виду, давайте рассмотрим ваш пример.
for_each(arr, arr + 5, Class());
Здесь Class()
создает экземпляр класса, а UnaryFunction
выводится как Class
.Это экземпляр перегрузки класса operator()
, так что это прекрасно.
for_each(arr, arr + 5, ob);
Здесь ob
- это экземпляр Class
, и, поскольку он передается по значению,это имеет тот же эффект, что и передача Class()
.
for_each(arr, arr + 5, Class);
Здесь вы пытаетесь передать тип , где ожидается значение.Это очень просто: нет-нет.
for_each(arr, arr + 5, ob());
Здесь вы звоните operator()
на объект ob
.Это плохо по двум причинам.1;потому что Class::operator()
ожидает один int
в качестве параметра, и это отсутствует.2;потому что это попытается передать значение, возвращаемое operator()
в for_each
.Поскольку вы определили Class::operator()
для возврата void
, это также не имеет смысла.