我知道将 const 引用变量传递给函数的 const 引用参数不会导致函数参数属于“裁判类型的 const 引用的 const 引用”类型。const 引用参数的变量名仅被视为裁判的另一个别名,但以不能使用该别名来修改裁判的保护为荣。
将引用变量的名称用作裁判变量的别名的想法很好地适用于variables,从而提供了另一层间接性。应用类似的想法似乎没有意义:
- 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&
变量作为第一个参数并将int
变量作为第二个参数的调用。)它不应该是无效的,因为 C++ 不允许“引用的引用”吗?不应该是,而不是
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&
?