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.

Respuestas a la pregunta(2)

Su respuesta a la pregunta