Функтор эквивалентен конструктору и методу? - PullRequest
0 голосов
/ 18 марта 2020

У меня есть 2 вопроса в моем путешествии к пониманию функторов в C ++.

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

  1. Будет ли состояние и поведение функтора копироваться только комбинацией конструктора и метода экземпляра? Метод экземпляра будет иметь возвращаемый тип. В примере уже есть конструктор, поэтому функтор не добавляет много. Разве функтор не является методом экземпляра?

  2. Разве вам не нужно было бы auto, чтобы сбить с толку выяснение, имеете ли вы дело с функцией или конструктором?

    add_x add42(42);

    // somewhere deeper in the code
    auto X = add42(8);

1 Ответ

3 голосов
/ 18 марта 2020

Функтор - это объект с перегруженным оператором вызова.

Конструктор - это функция, которую нельзя вызвать напрямую. Компилятор сгенерирует вызов конструктора при создании (нетривиального) объекта.

add_x add42(42);

Это синтаксис для прямой инициализации. add_x - это тип, add42 - это имя переменной, а 42 - список параметров для конструктора.

auto X = add42(8);

Поскольку мы знаем, что add42 это переменная, мы знаем, что X инициализируется с результатом вызова оператора вызова функции.

Если add42 был типом вместо объекта, это потенциально могло бы быть инициализацией этот тип.

Да, синтаксис оператора вызова и синтаксис инициализации одинаковы. Контекст определяет, какой из них используется.

...