Почему 'X x; x ();' разрешено, когда 'X' определяет преобразование в указатель на функцию, но не, когда он определяет преобразование в функтор?

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: И наоборот, почему одно и то же не разрешено, если мы определяем преобразование в другой функтор?

29
задан R. Martinho Fernandes 15 January 2012 в 20:22
поделиться