Кто-то предположил в комментариях, что объект функции может иметь дополнительное состояние. Хотя это правда, я был бы немного более конкретным c: вы можете создать несколько копий объекта функции с различным состоянием. Если объект функции одноэлементный, то этот вопрос спорный; функция также может иметь состояние в виде глобальных переменных.
И если ваш объект функции объявлен constexpr
, то ни одно из его внутренних состояний не может быть изменяемым. Это помещает ее в то же положение, что и функция constexpr
: ее вызов может быть постоянным выражением, но только до тех пор, пока он не обращается к какому-либо непостоянному выражению глобальному состоянию.
Одним из важных отличий до C ++ 17 было то, что функции могли быть inline
, а объекты - нет. В C ++ 14, если вы определили функтор foo
в заголовке, то для каждой единицы перевода будет одна его копия. Если вам нужно, чтобы foo
имел один и тот же адрес во всех единицах трансляции, вам нужно будет объявить его как функцию inline
. Но в C ++ 17 объекты функций также могут быть встроенными.
Но даже если у вас есть только один экземпляр объекта функции, и он не имеет состояния, и вы используете C ++ 17 или новее , есть по крайней мере одно важное различие между этим и функцией: функции можно найти с помощью поиска, зависящего от аргументов, а объекты функций - нет. Это причина того, почему некоторые «функции» в библиотеке C ++ 20 Ranges на самом деле вообще не могут быть функциями, а должны быть объектами функций. Их неофициально называют ниблоиды .