Рассмотрим этот код,
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);
}
Этот прекрасно компилируется , работает нормально.Но если я изменю f(B)
на f(B&)
, он не будет компилироваться .Если я напишу f(const B&)
, он снова скомпилируется нормально , работает нормально.Почему причина и обоснование?
Резюме:
void f(B); //okay
void f(B&); //error
void f(const B&); //okay
Я хотел бы услышать причины, обоснование и ссылки из спецификации языка для каждого из этих случаев.Конечно, сигнатуры функций сами по себе не являются некорректными.Скорее A
неявно преобразуется в B
и const B&
, но не в B&
, что приводит к ошибке компиляции.