Conversión implícita: referencia constante frente a referencia no constante frente a no referencia
Considera este código,
struct A {};
struct B { B(const A&) {} };
void f(B)
{
cout << "f()"<<endl;
}
void g(A &a)
{
cout << "g()" <<endl;
f(a); //a is implicitly converted into B.
}
int main()
{
A a;
g(a);
}
Estacompila bienCorre bien. Pero si cambiof(B)
af(B&)
, esono compila. Si yo escribof(const B&)
de nuevocompila bienCorre bien. ¿Por qué es la razón y la razón?
Resumen:
void f(B); //okay
void f(B&); //error
void f(const B&); //okay
Me gustaría escuchar razones, justificación y referencias de la especificación del lenguaje para cada uno de estos casos. Por supuesto, las firmas de funciones en sí mismas no son incorrectas. Más bienA
se convierte implícitamente enB
yconst B&
, pero no enB&
, y eso provoca el error de compilación.