Przejrzałem wiele pytań związanych z konwersją, ale wydawało się, że żaden z nich nie mówi w ten sposób o jawnym słowie kluczowym. Oto kod:(dotyczy jawnie) Pierwszeństwo z konwersją operatora i konstruktora
struct B;
struct A{
/*explicit*/ A(const B&){ cout << 1; } // *1
};
struct B{
/*explicit*/ operator A()const{ cout << 2; } // *2
};
void foo(const A &){}
int main(void){
B b;
foo(/*static_cast<A>*/ (b)); // *3
}
Wynik: (T: Odkomentowano, N: komentuje X: czy)
# | *1 | *2 | *3 |output|
1 | N | N | N |error |
2 | N | N | Y | 1 |
3 | N | Y | N | 1 |
4 | N | Y | Y | 1 |
5 | Y | N | N | 2 |
6 | Y | N | Y | 1 |
7 | Y | Y | N |error |
8 | Y | Y | Y | 1 |
1, 7 są błędy, co jest normalne (wieloznaczne i bez automatycznej konwersji.)
2 wydaje się, że konstruktor ma wyższy priorytet, ale dlaczego?
3, 5 są łatwe do zrozumienia.
4 jest dziwne, ponieważ nie nazywa tego wyraźnego. czemu?
6 może być spowodowane "jawnym" lub konstruktorem mającym wyższy priorytet. Który jest powodem? 8 wydaje się, że konstruktor ma wyższy priorytet, ale dlaczego?
Czy ktoś mógłby podać jakieś wyjaśnienia? Dzięki!
Jest to jeden z powodów, dla których nie należy mieć konstruktora konwertującego i operatora konwersji - prawie nigdy nie można tego naprawić.A kiedy to robisz, bardzo niewielu ludzi rozumie, dlaczego. –
@ BoPersson, wiem o tym. Po prostu ciekawi mnie, dlaczego kompilator działa w ten sposób. Wiem, że to nie jest praktyczne pytanie. Dzięki – Asu