考虑这段代码,
这个程序编译和运行都没问题。但如果我将
我希望听到语言规范中针对这些情况的原因、理由和参考资料。当然,函数签名本身并没有错误。相反,
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)
改成 f(B&)
,它就不能编译。如果我写成 f(const B&)
,它又会正常编译和运行。原因和逻辑是什么?void f(B); //okay
void f(B&); //error
void f(const B&); //okay
我希望听到语言规范中针对这些情况的原因、理由和参考资料。当然,函数签名本身并没有错误。相反,
A
隐式转换为 B
和 const B&
,但不是 B&
,这导致了编译错误。