La lectura de algunas preguntas aquí en SO sobre operadores de conversión y constructores me hizo pensar en la interacción entre ellos, es decir, cuando hay una llamada "ambigua". Considere el siguiente código:Operador de conversión frente a operador de conversión: precedencia
class A;
class B {
public:
B(){}
B(const A&) //conversion constructor
{
cout << "called B's conversion constructor" << endl;
}
};
class A {
public:
operator B() //conversion operator
{
cout << "called A's conversion operator" << endl;
return B();
}
};
int main()
{
B b = A(); //what should be called here? apparently, A::operator B()
return 0;
}
Las pantallas de código por encima de "llamada de un operador de conversión", lo que significa que el operador de conversión se denomina en contraposición al constructor. Si elimina/comenta el código operator B()
de A
, el compilador cambiará con mucho gusto al uso del constructor (sin ningún otro cambio en el código).
Mis preguntas son:
- Dado que el compilador no considera
B b = A();
ser una llamada ambigua, tiene que haber algún tipo de prioridad en el trabajo aquí. ¿Dónde exactamente está establecida esta precedencia? (se apreciaría una referencia/cita del estándar C++) - Desde un punto de vista filosófico orientado a objetos, ¿es así como debe comportarse el código? ¿Quién sabe más acerca de cómo un objeto
A
debe convertirse en un objetoB
,A
oB
? De acuerdo con C++, la respuesta esA
- ¿Hay algo en la práctica orientada a objetos que sugiera que este debería ser el caso? Para mí personalmente, tendría sentido en cualquier caso, así que estoy interesado en saber cómo se hizo la elección.
Gracias de antemano
La línea te comento "// constructor de copia" no es un constructor de copia, es un constructor. –
Tienes razón, hice un mal uso del término. Lo he editado. – GRB