このコードを考えてみましょう。
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
これらのケースのそれぞれについて、言語仕様からの理由、理論的根拠、および参照を聞きたいと思います。もちろん、関数のシグネチャ自体は間違っていません。暗黙的にandにA
変換されますが、 には変換されず、コンパイル エラーが発生します。B
const B&
B&