Я просмотрел множество вопросов, связанных с преобразованием, но, похоже, никто из них не обсуждал о явном ключевом слове таким образом. Вот код:(с явным) Приоритет с преобразованием оператора и конструктора
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
}
Результат: (Y: раскомментировал, N: комментировал, X: либо)
# | *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 ошибки, что является нормальным (неоднозначны и не авто преобразования.)
2 кажется, что конструктор имеет более высокий приоритет, но почему?
3, 5 легко понять.
4 странно, поскольку он не вызывает явного. Зачем?
6 может быть вызвано «явным» или конструктором с более высоким приоритетом. Какая причина? 8 кажется, что конструктор имеет более высокий приоритет, но почему?
Может кто-нибудь предложить некоторые объяснения? Благодаря!
Это одна из причин того, что у вас не должно быть как конвертирующего конструктора, так и оператора преобразования - вы вряд ли когда-нибудь это исправите.И когда вы это делаете, мало кто понимает, почему. –
@BoPersson, я это знаю. Мне просто интересно, почему компилятор работает так. Я знаю, это не практический вопрос. Спасибо – Asu