2012-03-23 48 views
0

考虑下面的短节目:参考的烦躁不沾类型的模板函数

#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为参考:假
会是解释吗?

+2

你没有使用完美的转发,只是正常的值复制。 – ildjarn 2012-03-23 17:05:51

+0

如果你试图通过引用强制该函数,然后使签名'template void fn(T&t)'。如果目标是“尝试”is_reference,那么这将无济于事。 – 2012-03-23 17:26:19

回答

1

C++ 2003模板类型演绎尝试查找匹配的参数类型。如果你想以参数作为参数,你需要这么说,并可能适当地重载模板。实际上,改变引用通常不是你想要的(尽管你可以删除推导​​类型的引用部分)。通常,由引用类型实现的概念与用于值的概念完全不同。另请注意,r只是x的另一个名称,用于类型推导和重载分辨率。

在C++ 2011,你可以要求编译器保留多一点的类型信息:使用右值的参考符号(即T&&为模板参数T)在模板推断类型时,该类型将被推断为参考cv-qualuiiers适用于左值和非左值的值类型。这是推导出的类型主要取决于参数是否是临时对象(或者至少看起来像一个)。