隐式转换:const引用vs非const引用vs非引用

Naw*_*waz 8 c++ reference const-reference implicit-conversion

考虑一下这段代码

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);
}
Run Code Online (Sandbox Code Playgroud)

编译正常,运行良好.但如果我f(B)改为f(B&),它就不会编译.如果我写f(const B&),它再次编译好,运行正常.原因和理由是什么?

摘要:

void f(B);         //okay
void f(B&);        //error
void f(const B&);  //okay
Run Code Online (Sandbox Code Playgroud)

我希望听到语言规范中的原因,理由和参考,以及每种情况.当然,功能签名本身并不正确.而是A隐式地转换为Bconst B&,但不会转换为B&导致编译错误.

fre*_*low 7

我想听听语言规范中的原因,理由和参考

C++的设计和演变是否足够?

但是,我犯了一个严重的错误,允许非const引用由非左值初始化[ 由我评论:措辞不精确!].例如:

void incr(int& rr) { ++rr; }

void g()
{
    double ss = 1;
    incr(ss);    // note: double passed, int expected
                 // (fixed: error in release 2.0)
}
Run Code Online (Sandbox Code Playgroud)

由于类型的不同,int&不能引用double传递,因此生成临时值以保存int初始化ss的值.因此,incr()修改了临时,结果没有反映回调用函数 [ 强调我的 ].

想一想:引用调用的全部内容是客户端传递由函数更改的内容,并且在函数返回后,客户端必须能够观察更改.