2010-03-14 4 views
2

Comment C++ détermine-t-il la conversion/construction implicite des objets de quelques niveaux de profondeur? par exemple:C++, comment la conversion/le constructeur implicite sont-ils déterminés?

struct A {}; 
struct B: A {}; 
struct C { operator B() { return B(); } }; 

void f(A a) {} 

int main(void) 
{ 
    f(C()); 
} 

-t-il créer l'arbre de toutes les conversions possibles et choisit terminal approprié? Autre chose? Merci

+1

Publiez du code compilable. Cela peut même répondre à votre question, si vous le compilez. –

Répondre

4

L'appel à f() aurait besoin de deux conversions, une conversion définie par l'utilisateur (C-B) et une conversion intégrée (dérivé à base : B à A). Les appels avec des arguments non correspondants réussissent lorsqu'ils ont besoin de zéro ou d'une conversion définie par l'utilisateur. Si différentes conversions (intégrées ou définies par l'utilisateur) réussissent, alors, si tous les moyens possibles sont égaux dans le nombre/type de conversions dont ils ont besoin, l'appel est ambigu et le compilateur doit émettre un diagnostic.

Comment les compilateurs implémentent cela n'est pas spécifié par la norme.

+0

merci, cela a du sens. savez-vous ce qui a la priorité, la conversion définie par l'utilisateur, C-> A ou le constructeur C (A)? – Anycorn

+0

@aaa: Je suis loin de ma profondeur ici, mais TTBOMK, si deux conversions définies par l'utilisateur sont possibles, l'appel est ambigu et le code ne devrait pas compiler. – sbi

+1

@aaa, veuillez donner le code complet. Dans votre code, seule une fonction de conversion est présente, et aucun constructeur 'C (A)'. Notre analyse montre que votre code donné, au moins, est correct et conforme à la norme. Maintenant, qu'en est-il du 'C (A)'? Je ne vois pas un tel constructeur ici. –

2

La norme ne le spécifie pas. Il spécifie seulement le résultat. Chaque fournisseur de compilateur différent peut les implémenter comme ils le souhaitent, à condition qu'ils donnent le bon résultat.

Donc, il y a probablement un tas de différentes approches là

Questions connexes