まず、提供する定義はすべて構文的に正しいです。それらがコンパイルされる場合、それらは構文的に正しいです。
パラメーターのconst
修飾子の目的は 1 つだけです。それは、関数本体が修飾されたconst
引数を変更するのを防ぐことです。
コード例の特定のケースでは、メソッドFoo::bar
は引数を変更しないため、const
修飾子を使用しても何の効果もありません。
ただし、const
すべての場合にデフォルトで使用し、変更を許可する状況でのみ削除することをお勧めします。したがって、これを のパラメーターに適用することをFoo::bar
お勧めします。多少のノイズが発生し、可読性が低下する可能性があるため、めったに使用しないことは認めますが、これは良い習慣だと思います。
考慮すべきもう1つのことは、プリミティブ型、またはより正確にはポインターではないかポインターを含まない型の場合、値によって渡される(つまり、参照によって渡されない)引数を変更しても、副作用はありません。これらの型のパラメーターは実際に機能します初期化されたローカル変数として (これは便利ですが、混乱を招く可能性があります)。ポインターの場合、ポイントされたデータの変更は外部に漏れます。これは、ポインターとtype のポイントされた部分のconst
両方で修飾子を使用するもう 1 つの正当な理由です。
全体const
として、可能な限り修飾子を使用すると、コードのエラーが発生しにくくなり、コンパイラが結果のプログラムを最適化するのにも役立ちます。
ただし、これらの型の参照を使用しても、これらの型が CPU レジスタに適合する値を記述している場合 (一般的にはそうです)、大きな変更を行うべきではありません。
したがって、メソッドの 3 つのバージョンはすべて、生成された同じアセンブリ コードになります。
プリミティブな戻り型の特定のケースでは、それは問題ではありません。戻り値は、修飾された値に前後に変換できますconst
。
const
他の人は、関数自体に対する修飾子の関心についても言及しています。Foo::bar
元の質問の範囲外ですが、可能であれば ( for のように) 関数を として修飾する方が実際に優れているとも言いconst
ます。