Considérez ce code,conversion implicite: référence const vs référence non-const vs non-référence
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);
}
Ce compiles fine, fonctionne très bien. Mais si je change f(B)
en f(B&)
, il . Si j'écris f(const B&)
, c'est à nouveau compiles fine, fonctionne bien. Pourquoi est la raison et la raison?
Résumé:
void f(B); //okay
void f(B&); //error
void f(const B&); //okay
Je voudrais entendre les raisons, la justification et référence (s) de la spécification du langage, pour chacun de ces cas. Bien sûr, les signatures de la fonction elles-mêmes ne sont pas incorrectes. Plutôt A
convertit implicitement en B
et const B&
, mais pas en B&
, et cela provoque l'erreur de compilation.
Une chose intéressante: Dans l'ARM, la détermination de la lvalueness pour l'expression primaire est la suivante: "Le résultat est une lvalue si l'identificateur est." .. "Le résultat est une lvalue si le membre est.". Je me suis demandé ce que cela signifiait, car il définit aussi «Une lvalue est une expression se référant à un objet ou à une fonction». Hmm, peut-être que cela signifie simplement "Le résultat est une valeur si elle se réfère à un objet ou une fonction." –
C'est bon. Je pense que cela répond mieux à ma question, car cela explique pourquoi ce n'est pas autorisé. J'accepte ceci comme réponse à ma question. :-) – Nawaz