考虑以下短程序:
#include <type_traits>
#include <iostream>
using namespace std;
template <typename T>
void fn( T t ) {
cout << "T is reference: " <<
boolalpha << is_reference<T>::value << endl;
}
int main( void ) {
int x = 0;
int& r = x;
fn( r );
}
运行这个程序,我得到:T is reference: false。
会是解释吗?
最佳答案
C++ 2003 模板类型推导试图找到匹配的参数类型。如果你想将引用作为参数,你需要这样说并且可能适本地重载模板。更改引用实际上通常不是您想要的(尽管您可以删除推导类型的引用部分)。通常,引用类型实现的概念与用于值的概念完全不同。另请注意 r
只是 x
的另一个名称用于类型推导和重载解析。
在 C++ 2011 中,您可以要求编译器保留更多的类型信息:当使用右值引用符号(即 T&&
对于模板参数 T
)推导模板中的类型时,类型将被推导为是对左值适当应用 cv-qualiiiers 的引用,对非左值应用值类型。也就是说,推导的类型本质上取决于参数是否是一个临时对象(或者至少看起来像一个)。
关于c++ - 引用性与模板函数中的类型无关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9843354/