29 votes

Pourquoi est 'X x; X();' autorisé, quand «X» définit une conversion en pointeur de fonction, mais pas, quand il définit une conversion en foncteur?

 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 ?!
}
 

Exemple en direct sur Ideone . Production:

erreur: aucune correspondance pour l'appel à '(Y) (int)'

Q1: Pourquoi l'appel à x(5) autorisé, même si X définit uniquement une conversion en pointeur de fonction, et non operator() ?

Q2: Inversement, pourquoi la même chose n'est-elle pas autorisée, si nous définissons une conversion vers un autre foncteur?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X