C++では、関数のシグネチャは、constであるかどうかに部分的に依存します。つまり、1つのクラスがconstであり、他のconstが異なることを除いて、クラスは2つのメンバー関数を持つことができます。このようなクラスがある場合、コンパイラーは、呼び出す関数に基づいて、呼び出す関数を決定します。それがクラスのconstインスタンスである場合、関数のconstバージョンが呼び出されます。オブジェクトがconstでない場合、他のバージョンが呼び出されます。
この機能をどのような状況で利用したいですか?
これは、メンバー関数がクラスのデータメンバー(またはメンバーのメンバー、メンバーのメンバーのメンバーなど)へのポインターまたは参照を返す場合にのみ意味があります。一般に、const以外のポインターまたはデータメンバーへの参照を返すことは避けられますが、場合によっては合理的であるか、単に非常に便利です([]演算子など)。そのような場合、ゲッターのconstバージョンと非constバージョンを提供します。このようにして、オブジェクトを変更できるかどうかの決定は、それを使用する関数に依存します。constまたはnon-constを宣言することを選択できます。
そこにあるので、コンパイラーにconstオブジェクトと通常のオブジェクトのどちらを返すかを強制し、それでも同じメソッドシグネチャを維持できます。 Const Correctness に詳細な説明があります。
Std :: map :: operator []の動作を確認してください。無効なキーを参照しようとするとconstバージョンはエラーをスローしますが、非constバージョンは挿入を行います。挿入動作はstd :: map :: insertを使用する必要がある場合よりもはるかに便利です(さらに、上書きが行われます)が、constマップに対しては機能しません。