Conversão implícita: referência const vs referência não const vs não referência

Considere 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);
}

estecompila bem, corre bem. Mas se eu mudarf(B) paraf(B&), istonão compila. Se eu escreverf(const B&), isso de novocompila bem, corre bem. Por que razão e razão?

Resumo:

void f(B);         //okay
void f(B&);        //error
void f(const B&);  //okay

Gostaria de ouvir as razões, a justificativa e as referências da especificação da linguagem, para cada um desses casos. Obviamente, as próprias assinaturas de função não estão incorretas. Em vezA converte implicitamente emB econst B&, mas não paraB&e isso causa o erro de compilação.

questionAnswers(2)

yourAnswerToTheQuestion