考虑下面的代码,
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);
}
这个compiles fine运行得很好。但是如果我把f(B)
改成f(B&)
,它就是doesn't compile。如果我写f(const B&)
,它又是compiles fine,运行得很好。原因和理由是什么?
摘要:
void f(B); //okay
void f(B&); //error
void f(const B&); //okay
我想从语言规范中听到每种情况的原因、理由和参考。当然,函数签名本身并不是不正确的。相反,A
会隐式转换为B
和const B&
,但不会转换为B&
,这会导致编译错误。
发布于 2011-01-16 09:20:50
我想从语言规范中听到原因、原理和参考资料
C++的设计和发展足够了吗?
我犯了一个严重的错误,允许非常数引用由我自己的非左值注释初始化:这个措辞不精确!例如:
void incr( int & rr) { ++rr;} void g() { double ss = 1;incr(ss);//注意:双重传递,int预期// (已修复:2.0版本中的错误)}
由于类型的不同,int&
不能引用传递的double
,因此生成了一个临时函数来保存由ss
的值初始化的int
。因此,incr()
修改了临时函数,而没有将结果反映回调用函数 emphasis。
想一想:按引用调用的全部要点是,客户端传递由函数更改的内容,在函数返回后,客户端必须能够观察到这些更改。
https://stackoverflow.com/questions/4704404
复制相似问题