Peut-on surcharger une fonction uniquement si un paramètre est une valeur ou une référence?

J’ai la réponse NON! Parce que passer par valeur et passer par référence semblent identiques à l’appelant.

Cependant, le code ci-dessous comstack à droite

class A { public: void f(int i) {} void f(int& i) {} }; 

Mais quand j’essaye de l’utiliser, il y a une erreur de compilation.

 int main () { A a; int i = 9; int& j = i; af(1); af(i); af(j); return 0; } 

Pourquoi le compilateur ne le désactive-t-il pas même sans savoir qu’il va être utilisé?

Oui, ils peuvent être surchargés en fonction des références ou non. C’est pourquoi c’est parfaitement bien de les faire coexister comme ça; ils sont différents.

Le problème est lié à l’ambiguïté. Alors que f(1) ne peut être appelé que sur une variante, f(i) peut être appelé sur les deux. Ni est préférable, donc vous obtenez une erreur d’ambiguïté. Si vous ajoutez une troisième fonction, foo (const int&) , tous les appels seront ambigus. Mais tous sont toujours surchargés les uns des autres et non conflictuels.

Je conviens que c’est étrange de pouvoir avoir trois surcharges d’une fonction et de pouvoir appeler directement personne. Peut-être que quelqu’un d’autre a plus à append.

Vous pouvez appeler chaque méthode:

 void (A::*t)(int& ) =&A::f; A a; int i = 9; int& j = i; af(1); // f(int i) (a.*t)(i); // f(int& i)