C++ 类型推导(第一部分)
在调用模板(函数)的时候,编译器会根据实参类型推导模板参数类型和函数参数类型,从而实例化出对应的函数。通常模板参数类型的推导结果与函数参数类型的推导结果不一样,这是因为函数参数类型会有诸如 const、reference、volatile 等修饰符。模板参数类型的推导结果不仅取决于实参类型还依赖函数参数类型的形式,本文只讨论其中一种形式——函数参数类型组成部分包含指针或引用,但不是万能引用。
如下代码片段 T,即模板参数类型;ParamType,为函数参数类型(形式);expr 为实参,其类型是 int。
template<typename T>
void foo(ParamType v) {
}int expr = 9;
foo(expr);
一、ParamType 是个引用(指针)但不是万能引用时 T 的推导规则
- 如果实参(expr)含有引用,先将其引用部分忽略;
- 然后把 expr 的类型和 ParamType的类型进行模式匹配,进而确定 T 的类型。
二、推导过程举例
上文提到 ParamType 的形式决定T的推导结果,接下来一一列举ParamType 的各种形式的推导过程:
- ParamType 为 T& 形式
#include <iostream>#include <boost/type_index.hpp>template<typename T>
static inline void test_ref_pattern(T& v) {using boost::typeindex::type_id_with_cvr;using std::cout;using std::endl;cout << "T=" << type_id_with_cvr<T>().pretty_name()<< ", ParamType=" << type_id_with_cvr<decltype(v)>().pretty_name() << endl;
}int main() {int x = 66;test_ref_pattern(x);}
- ParamType 为 const T& 形式
template<typename T>
void test_const_ref_pattern(const T &v) {}
- ParamType 为 T 形式
template<typename T>
void test_value_pattern(T v) {}