Отличный ответ, приятно видеть ссылки на дальнейшие объяснения.

отрим этот код,

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)&nbsp;вf(B&), Этоне компилируется, Если я напишуf(const B&), это сновакомпилирует нормальноработает нормально. Почему причина и обоснование?

Резюме:

void f(B);         //okay
void f(B&);        //error
void f(const B&);  //okay

Я хотел бы услышать причины, обоснование и ссылку (я) из спецификации языка для каждого из этих случаев. Конечно, сигнатуры функций сами по себе не являются некорректными. СкорееA&nbsp;неявно преобразуется вB&nbsp;а такжеconst B&, но не вB&и это приводит к ошибке компиляции.