Отличный ответ, приятно видеть ссылки на дальнейшие объяснения.
отрим этот код,
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&
и это приводит к ошибке компиляции.