対非const参照VS const参照は暗黙的な変換:非参照
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
Iは、これらの場合のそれぞれについて、言語仕様から理由、根拠と基準(複数可)を聞きたいです。もちろん、関数のシグネチャ自体は間違っているわけではありません。むしろA
はB
とconst B&
に暗黙的に変換されますが、B&
には変換されず、コンパイルエラーが発生します。
興味深いこと:ARMでは、一次式の有効性の決定は次のようになります。「結果が識別子の場合は左辺値です。」 msgstr "メンバーがメンバーの場合、結果は左辺値です。"私は、それはあまりにも意味があるはずですが、それはあまりにも "左辺値はオブジェクトや関数を参照する表現です"と定義しているのだろうかと疑問に思っています。うーん、多分それは単に "結果が左辺値であるということは、それがオブジェクトまたは関数を参照する場合です"という意味ですか? –
これは良いことです。なぜそれが許されないのか理由を説明するので、私の質問によく答えると思う。私はこれを私の質問に対する答えとして受け入れています。 :-) – Nawaz