Страницы

Поиск по вопросам

среда, 10 октября 2018 г.

Является ли функция функтором

Является ли функция функтором?
Функцию можно применять в качестве функтора в 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.
Именно здесь, вероятно, авторы книг проводят водораздел между объектами, которые предоставляют оператор функцию, и простыми указателями на функции, называя первых функторами.

Комментариев нет:

Отправить комментарий