Функтор - это объект с перегруженным оператором вызова.
Конструктор - это функция, которую нельзя вызвать напрямую. Компилятор сгенерирует вызов конструктора при создании (нетривиального) объекта.
add_x add42(42);
Это синтаксис для прямой инициализации. add_x
- это тип, add42
- это имя переменной, а 42
- список параметров для конструктора.
auto X = add42(8);
Поскольку мы знаем, что add42
это переменная, мы знаем, что X
инициализируется с результатом вызова оператора вызова функции.
Если add42
был типом вместо объекта, это потенциально могло бы быть инициализацией этот тип.
Да, синтаксис оператора вызова и синтаксис инициализации одинаковы. Контекст определяет, какой из них используется.