この例では:
template <typename T>
inline T const& Max (T const& a, T const& b) {
return a < b ? b : a;
}
具体的には、この部分:
...const& Max (T const& a, T const& b)...
が何に使われているのかわかりません&
。がなくても同じ機能を作成できますが、&
それでも機能します。ここでアドレスを取得するポイントは何ですか?
この例では:
template <typename T>
inline T const& Max (T const& a, T const& b) {
return a < b ? b : a;
}
具体的には、この部分:
...const& Max (T const& a, T const& b)...
が何に使われているのかわかりません&
。がなくても同じ機能を作成できますが、&
それでも機能します。ここでアドレスを取得するポイントは何ですか?
&がなくても同じ関数を作成できますが、それでも機能します。
いいえ、できません。アンパサンドを削除すると、機能が大きく異なります。この新しい関数は、渡された引数のコピーを作成し、コピーを返します。アンパサンドを使用すると、関数はコピーを作成しません。戻り値は、大きい方の入力のエイリアスです。
別の例を次に示しconst
ます。引数と戻り値の両方の修飾子を削除します。この変更により、この関数は割り当ての左側で使用できるようになります。アンパサンドなしでこれを行う方法はありません。
#include <iostream>
template <typename T>
inline T & Max (T & a, T & b) {
return a < b ? b : a;
}
int main () {
int a = 1;
int b = 2;
Max(a,b) = 42;
std::cout << "a=" << a << " b=" << b << "\n";
}
この場合の & 記号はアドレスを取得していませんが、参照変数を作成しています。参照は、常に逆参照されるポインターと考えてください。これは実際にはそうではありませんが、それを説明する最も簡単な方法です。
その背後にある思考プロセスは基本的に、「(何らかの理由で) 参照渡しをしたいのですが、途中で変更されないようにしたいのです。 const を持つパラメーター。".
それが参照であるという事実は、値を新しいスコープ (関数) にコピーしていないことを意味します。代わりに、関数を呼び出したスコープから元のバージョンを参照しています。const の理由は、単に値が変わらないことを保証するためです。
http://www.learncpp.com/cpp-tutorial/73-passing-arguments-by-reference/の「const リファレンスによる受け渡し」セクションを読んでください。
const の使用に関する多くの詳細のより完全な説明: http://en.wikipedia.org/wiki/Const-correctness