Чтение некоторых вопросов здесь о SO о операторах преобразования и конструкторах заставило меня задуматься о взаимодействии между ними, а именно, когда есть "неоднозначный" вызов. Рассмотрим следующий код:
class A;
class B {
public:
B(){}
B(const A&) //conversion constructor
{
cout << "called B conversion constructor" << endl;
}
};
class A {
public:
operator B() //conversion operator
{
cout << "called A conversion operator" << endl;
return B();
}
};
int main()
{
B b = A(); //what should be called here? apparently, A::operator B()
return 0;
}
В приведенном выше коде отображается "называемый оператор преобразования", что означает, что оператор преобразования вызывается в отличие от конструктора. Если вы удалите/закомментируете код operator B()
из A
, компилятор с радостью переключится на использование конструктора (без каких-либо изменений кода).
Мои вопросы:
- Поскольку компилятор не считает, что
B b = A();
является двусмысленным вызовом, здесь должен быть некоторый тип приоритета. Где именно установлен этот приоритет? (оценка/цитата из стандарта С++ была бы оценена) - С объектно-ориентированной философской точки зрения, так поступает код? Кто знает больше о том, как объект
A
должен стать объектомB
,A
илиB
? Согласно С++, ответA
- есть ли что-либо в объектно-ориентированной практике, которая предполагает, что это должно быть так? Для меня лично это имело бы смысл в любом случае, поэтому мне интересно узнать, как был сделан выбор.
Заранее спасибо