Неявное преобразование: константная ссылка vs неконстантная ссылка vs неконстантная ссылка

Рассмотрим этот код,

struct A {};
struct B {  B(const A&) {} };
void f(B)
{
    cout << "f()"<

Этот компилируется нормально , работает нормально. Но если я изменю 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 & , и это вызывает ошибку компиляции.

8
задан Nawaz 16 January 2011 в 08:22
поделиться