重複の可能性:
const 引数を持つ関数とオーバーロード
オーバーロードと const 宣言の規則にかなり混乱しています。ここに私を困惑させる 2 つの事柄があります。私の頭の中のより深い誤解を見つけるのを手伝ってくれるかもしれません。;)
創刊:
私のコンパイラはこれを許可します:
void f(int & x) {
std::cout << "plain f" << std::endl;
}
void f(const int & x) {
std::cout << "const f" << std::endl;
}
ただし、次の場合はコンパイル エラーが発生します (関数には既に本体があります)。
void f(int x) {
std::cout << "plain f" << std::endl;
}
void f(const int x) {
std::cout << "const f" << std::endl;
}
const は、渡されたオブジェクトが変更されておらず、2 番目のケースではとにかくコピーされていることをコンパイラに伝えるためだけにあると思っていたので、これは理にかなっていると思います。しかし、それが正しければ、なぜ const を使用して関数をオーバーロードできるのでしょうか?
言い換えれば、コンパイル バージョンを使用して、次のように関数を呼び出すとどうなりますか。
int x1 = 5;
const int x2 = 5;
f(x1);
f(x2);
「const f」の代わりに「plain f」と「const f」を 2 回取得することはできますか? どうやら私は const を使用して、参照が変更されないだけでなく、どの関数を呼び出すかをコンパイラに指示しているようです。「プレーン」バージョンを削除すると問題なく動作し、「const」バージョンを 2 回呼び出すため、これはさらに混乱します。
さて、私の実際の質問は何ですか?この動作の背後にあるアイデアが何であるかを知りたいです。そうしないと、記憶するのが非常に難しいからです。