pierwszeństwo konwersji w c ++
Mam następujący kod:
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
W głównej funkcji:
h(1);
Funkcja wywoływana przez h (1) to f1.
Moje pytanie brzmi: dlaczego to nazywa. 1 jest int i dlatego wymaga niejawnej konwersji na double. Może równie łatwo przekonwertować int na A przy użyciu zdefiniowanego powyżej konstruktora konwersji. Dlaczego nie pojawia się błąd? Jakie są zasady pierwszeństwa w castingu?
N.b. Opublikowałem powyżej kodu, który moim zdaniem będzie konieczny, aby odpowiedzieć na pytanie, ale poniżej zamieszczam cały kod:
#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);
}