これらの宣言が機能しない (互換性がない) 理由を知りたい
void f(int); //p1
void f(const int);//p2
void f(int &);//p3
void f(const int &);//p4
私がよく理解していれば、コンパイラは (int &) と (const int &) の違いを見つけられず、f(12) と書くと、最初の 2 つの宣言のどちらかを選択することができなくなります。 ?
これらの宣言が機能しない (互換性がない) 理由を知りたい
void f(int); //p1
void f(const int);//p2
void f(int &);//p3
void f(const int &);//p4
私がよく理解していれば、コンパイラは (int &) と (const int &) の違いを見つけられず、f(12) と書くと、最初の 2 つの宣言のどちらかを選択することができなくなります。 ?
p3 と p4 は完全に明確で区別可能ですが、p1 と p2 はそうではありません。(もちろん、p1/p2 は p3 および p4 と区別できます。)
その理由はconst
、値パラメーターの最上位は検出できず、宣言では実際には役に立たないためです。たとえば、次のことができます。
void foo(int x); // declaration
// ...
void foo(const int x){
// definition/implementation
}
const
とにかくコピーを作成するため、呼び出し元にとって重要ではない実装の詳細を次に示します。そのコピーが just と区別できない理由でもありint
、呼び出し側からはまったく同じです。
const int& r
には最上位レベルがないことに注意してください。これはconst
、定数整数を参照する参照です (参照は常に定数です)。宣言されていない場合に変更される可能性のあるポインタについては、どこに配置するかについてのこの質問const
も参照してください。const