je le code suivant:priorité de conversion en C++
Some functions:
A::A(int i_a) {cout<<"int Ctor\n";} //conversion constructor
void h(double d) {cout<<"double param\n";} //f1
void h(A a) {cout<<"A param\n";} //f2
Dans la fonction principale:
h(1);
La fonction h (1) appelle est f1.
Ma question est pourquoi est-ce qu'il choisit de s'appeler cela. 1 est un int et nécessite donc conversion implicite en double. Il pourrait tout aussi bien convertir l'int en un A en utilisant le constructeur de conversion défini ci-dessus. Pourquoi n'ai-je pas d'erreur? Quelles sont les règles de priorité avec le casting?
N.b. Je l'ai posté au-dessus du code que je pense que ce sera nécessaire pour répondre à la question, mais au-dessous je poste le code entier:
#include <iostream>
using namespace std;
class B;
class A {
public:
explicit A(const B&) {cout<<"Ctor through B\n";}
A() {cout<<"Default Ctor\n";}
A(int i_a) {cout<<"int Ctor\n";}
operator int() {cout<<"A => int\n"; return 2;}
};
class B {
public:
operator A() const {cout<<"B => A\n"; A a; return a;}
};
void h(double d) {cout<<"double param\n";}
void h(A a) {cout<<"A param\n";}
void f(const A& a)
{
cout<<"f function\n";
//Without the const it will never try to convert
}
void main()
{
B b;
cout <<"-----------------\n";
f(b);
cout <<"-----------------\n";
h(1);
}
Lors de l'écriture d'un code. N'ajoutez PAS de numéros de ligne - il est impossible de le compiler sans modification supplémentaire. Si vous souhaitez afficher un numéro de ligne, utilisez un commentaire. –
numéros de ligne modifiés. – Tom
En tant que sidenote, je n'appellerais pas "A :: A (int i_a)" un constructeur de conversion, juste un constructeur de A qui se trouve prendre un int en paramètre. De même, il est toujours bon d'appeler h (any h) avec ses paramètres exacts. S'il prend un A (la deuxième fonction), alors pourquoi ne pas lui passer un A? Par exemple h (A (1)); –