void f(int){} typedef void (*f_ptr)(int); struct Functor{ void operator()(int){} }; struct X{ operator f_ptr(){ return f; } }; struct Y{ operator Functor(){ return Functor(); } }; int main(){ X x; Y y; x(5); // works ?! y(5); // doesn't ?! }
Живой пример на Ideone . Вывод:
ошибка: нет совпадения для вызова '(Y) (int)'
Q1: почему вызов
x (5)
разрешен, хотяX
определяет только преобразование в указатель на функцию, а неoperator ()
?Q2: И наоборот, почему одно и то же не разрешено, если мы определяем преобразование в другой функтор?