В чем разница между указателями функций, объектами функций и лямбда-функциями?

Я знаю, что каждый может быть передан другой функции. Все они кажутся мне альтернативами с тонкими различиями.

  • указатель функции: указатель на функцию

  • объект функции: экземпляр класса, который перегрузил оператор(); способный действовать как функция;

  • lambda function: анонимная функция (недавно введенная в С++ 11), которая может быть определена на месте и существует только во время жизни оператора, частью которого является

Из-за тонкостей, мне интересно, какой из трех вариантов будет наиболее подходящим в данном сценарии. Итак, эксперты там, любезно пролить свет (по некоторым критериям отбора?), Чтобы я мог решать и использовать их в разных сценариях.

1 ответ

объект функции: объект f, который вы можете вызвать с помощью синтаксиса f(x). Сюда входят указатели на функции, объекты класса с перегруженной функцией operator() или преобразования в указатель/ссылку на функцию.

Стандарт имеет прямое определение этого слова

Тип объекта функции - это тип объекта (3.9), который может быть типом постфиксного выражения в вызове функции (5.2.2, 13.3.1.1). Функциональный объект является объектом типа объекта функции.

В частности, ссылка на функцию или функцию не является функциональным объектом, хотя они являются вызываемыми объектами. Некоторые люди путают термин "функциональный объект" и воспринимают его как объекты класса с перегруженным operator().

указатель на функцию: указатель a, err, указатель на функцию

лямбда-функция. Я думаю, вы ссылаетесь на lambdas С++ 11. На самом деле это не функции, а специальные создаваемые компилятором объекты типа класса с перегруженным operator().

licensed under cc by-sa 3.0 with attribution.