引用性不依赖于模板函数中的类型

reference-ness doesn't stick with type in a template function

本文关键字:函数 类型 依赖于 引用      更新时间:2023-10-16

考虑以下短程序:

#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
这会是一个解释吗?

C++2003模板类型推导试图找到匹配的参数类型。如果你想把引用作为参数,你需要这样说,并可能适当地重载模板。实际上,更改引用通常不是您想要的(尽管您可以删除推导类型的引用部分)。一般来说,引用类型实现的概念与用于值的概念大不相同。还要注意,r只是x的另一个名称,用于类型推导和重载解析。

在C++2011中,您可以要求编译器保留更多的类型信息:当使用右值引用表示法(即模板参数TT&&)推导模板中的类型时,该类型将被推导为具有适用于左值的cv qualuiers和适用于非左值的值类型的引用。这就是推导的类型,本质上取决于参数是否是一个临时对象(或者至少看起来像一个)。