reference-ness不会在模板函数中使用类型

时间:2012-03-23 17:01:10

标签: c++ c++11 typetraits

考虑以下简短程序:

#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是引用:false
会是解释吗?

1 个答案:

答案 0 :(得分:1)

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

在C ++ 2011中,您可以要求编译器保留更多类型信息:使用rvalue引用表示法(即T&&为模板参数T)推断模板中的类型时,类型将被推断为适用于左值的cv-qualuiiers和非左值的值类型的引用。这就是推导出的类型,主要取决于参数是否是一个临时对象(或者至少是一个临时对象)。