引用性不依赖于模板函数中的类型
reference-ness doesn't stick with type in a template function
考虑以下短程序:
#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中,您可以要求编译器保留更多的类型信息:当使用右值引用表示法(即模板参数T
的T&&
)推导模板中的类型时,该类型将被推导为具有适用于左值的cv qualuiers和适用于非左值的值类型的引用。这就是推导的类型,本质上取决于参数是否是一个临时对象(或者至少看起来像一个)。
相关文章:
- 为什么在我的函数类型后使用引用运算符 (&) 允许我修改它返回的值?
- 来自 DLL 的函数调用 [表观调用的括号前面的表达式必须具有(指向-)函数类型]
- 是否有任何建议来统一函数类型限定符并简化可恶的函数类型?
- 关于 C++ 中的函数类型定义
- 用于检测函数类型是否为否的特征
- 函数类型参数的模板参数推导
- 标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
- C++无效的函数类型转换
- STL 函数和函数类型与函数指针类型
- 如何将result_of与函数类型定义一起使用
- 将模板(没有规范)传递给 std::thread() 会出现错误:<未解析的重载函数类型>匹配错误
- C++ 编译错误:gnu_printf是无法识别的格式函数类型
- 专门用于"direct"函数类型(与函数指针类型相对)
- 将函数类型作为模板参数传递不会编译
- 通过参数传递 lambda(无函数类型模板)
- 如何在模板参数中分离函数类型返回类型和参数
- 为什么比较函数类型需要指定为模板参数?
- 带有限定符的函数类型定义用例
- 如何声明对函数类型的常量引用
- 非类型模板参数允许各种函数类型?