Является ли функция функтором?
Функцию можно применять в качестве функтора в STL алгоритмах, но почему-то книги упорно доказывают, что функция это функция, а функтор - это именно объект
Ответ
В стандарте C++ нет такого термина, как функтор. Обычно в книгах под этим понятием подразумевают так называемый объект функции - термин, который действительно определен в стандарте C++.
Из стандарта C++ (20.9 Function objects)
1 A function object type is an object type (3.9) that can be the
type of the postfix-expression in a function call (5.2.2, 13.3.1.1).230
A function object is an object of a function object type. In the
places where one would expect to pass a pointer to a function to an
algorithmic template (Clause 25), the interface is specified to accept
a function object. This not only makes algorithmic templates work with
pointers to functions, but also enables them to work with arbitrary
function objects
Поэтому под функторами авторы книг скорей всего имеют в виду объекты функций. Так как функции не относятся к типам объектов, то они не включаются в это понятие.
С другой стороны а сноске 230 написано относительно типа постфиксного выражения вызова функции
230) Such a type is a function pointer or a class type which has a
member operator() or a class type which has a conversion to a pointer
to function.
Тем не менее, алгоритмы могут принимать функции по ссылке, а не обязательно указатели на функции.
Сама приведенная цитата может трактоваться неоднозначно. Думаю, что ключом к ее правильной трактовке является следующая фраза из приведенной цитвты
In the places where one would expect to pass a pointer to a function
to an algorithmic template (Clause 25), the interface is specified to
accept a function object.
Именно здесь, вероятно, авторы книг проводят водораздел между объектами, которые предоставляют оператор функцию, и простыми указателями на функции, называя первых функторами.
Комментариев нет:
Отправить комментарий