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.