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隐式地转换为B和const B&,但不会转换为B&导致编译错误.
我想听听语言规范中的原因,理由和参考
C++的设计和演变是否足够?
但是,我犯了一个严重的错误,允许非const引用由非左值初始化[ 由我评论:措辞不精确!].例如:
Run Code Online (Sandbox Code Playgroud)void incr(int& rr) { ++rr; } void g() { double ss = 1; incr(ss); // note: double passed, int expected // (fixed: error in release 2.0) }由于类型的不同,
int&不能引用double传递,因此生成临时值以保存int初始化ss的值.因此,incr()修改了临时,结果没有反映回调用函数 [ 强调我的 ].
想一想:引用调用的全部内容是客户端传递由函数更改的内容,并且在函数返回后,客户端必须能够观察更改.