const 参照変数を関数の const 参照パラメーターに渡しても、関数パラメーターが "被参照型の const 参照の const 参照"型にならないことはわかっています。const 参照引数の変数名は、レフリーの別のエイリアスとして扱われるだけですが、そのエイリアスを使用してレフリーを変更できないという保護が与えられています。
参照変数の名前が参照変数のエイリアスであるかのように使用されるという考え方は、変数にうまく適用され、間接的な別のレイヤーが提供されます。以下の類似のアイデアを適用することは意味がないように思われます。
- const 参照型自体がその参照先の型のエイリアスであるかのように使用されている、
- その参照先の型のエイリアスとして使用されているconst 参照型
typedef
の a 、 - テンプレート パラメーターがであり、その関数パラメーターが である場合、パラメーターに渡される (または
template
パラメーターによって推定される) const 参照変数は、その型がその参照の型として解釈されます。typename T
T const&
しかし、それは次のように発生するようです。
#include <typeinfo>
#include <iostream>
template <typename T>
T const& min(T const& a, T const& b) {
std::cout << typeid(a).name() << std::endl;
std::cout << typeid(b).name() << std::endl;
return a < b ? a : b;
}
int main() {
int x = 6, y = 7;
int const& rx = x;
std::cout << typeid(rx).name() << std::endl; // "int"
int z = ::min(rx, y); //output shows both "a" and "b" are of type "int"
std::cout << z << std::endl; // “6”
typedef int const& icr;
std::cout << typeid(icr).name() << std::endl; // "int"
std::cout << typeid(int const&).name() << std::endl; // "int"
}
なぜ関数テンプレートは、既に になっている引数に対しても機能するの
int const&
ですか? (サンプルコードではint const&
、第一引数に変数、第二引数に変数を指定した呼び出しでも動作しました。) C++では「参照の参照」がint
許されないので無効なのではないでしょうか?typeid
の代わりname()
にint const&
_int const&
_int
_そうでない場合、この意味
int const&
はint
;のエイリアスではないでしょうか。どちらも異なる型 (変数の名前ではない) であるため、意味がありません。変数名に戻ると、次のようになります。
int num = 8; int const& ref = num; std::cout << typeid(ref).name() << std::endl;
なぜ出力
int
ではなく、なぜint const&
ですか?