Considere este código,conversión implícita: referencia constante vs referencia no const vs no es de referencia
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);
}
Este compiles fine, funciona muy bien. Pero si cambio f(B)
a f(B&)
, es doesn't compile. Si escribo f(const B&)
, de nuevo compiles fine, funciona bien. ¿Por qué razón y razón de ser?
Resumen:
void f(B); //okay
void f(B&); //error
void f(const B&); //okay
me gustaría escuchar razones, fundamentos y de referencia (s) de la especificación del lenguaje, para cada uno de estos casos. Por supuesto, las firmas de función en sí mismas no son incorrectas. Más bien A
se convierte implícitamente en B
y const B&
, pero no en B&
, y eso causa el error de compilación.
Una cosa interesante: en el ARM, la determinación de lvalueness para primary-expression es la siguiente: "El resultado es un lvalue si el identificador es". .. "El resultado es un lvalue si el miembro es". Me he preguntado qué diablos debería significar, porque también define "Un lvalue es una expresión que se refiere a un objeto o función". Hmm, tal vez solo signifique "El resultado es un lvalue si se refiere a un objeto o función". –
Esto es bueno. Creo que es mejor responder a mi pregunta, ya que explica por qué no está permitido. Estoy aceptando esto como respuesta a mi pregunta. :-) – Nawaz