C++ 中的型别推导
1. 模板型别推导
对于以下函数模板和调用
// 函数模板
template<typename T>
void func(ParamType param);
// 调用模板函数
func(expr);
编译器会在编译期通过 expr 推导两个型别:T 和 ParamType。比如
// 函数模板
template<typename T>
void func(const T& param);
// 模板函数调用
int i = 0;
func(i);
则 T 被推导为 int,ParamType 被推导为 const int&。但是,T 的型别推导结果不一定与传递给函数的实参(expr)的型别一致;T 的型别推导结果不仅依赖实参的型别,还依赖 ParamType 的形式:
ParamType是个指针或引用,但不是万能引用ParamType是万能引用ParamType既不是指针也不是引用
Case 1. ParamType 是个指针或引用,但不是万能引用
- 若
expr是个引用,则先忽略引用部分,再对expr的型别和ParamType的型别进行模式匹配,从而决定T的型别
// 函数模板
template<typename T>
void func(T& param);
// 调用模板函数
int x = 27;
func(x); // ParamType 推导为 int&,T 推导为 int
const int cx = x;
func(cx); // ParamType 推导为 const int&,T 推导为 const int
const int& rcx = x;
func(rcx); // 先忽略引用,即相当于 func(cx),因此
// ParamType 推导为 const int&,T 推导为 const int
从上述结果我们也可以看到,对象的常量性(constness)会成为 T 的型别推导结果的组成部分,但其引用性(reference-ness,包括左值引用和右值引用)会在型别推导过程中被忽略(当然,只能向右值引用形参传递右值引用实参)
// 函数模板
template<typename T>
void func(const T& param)

本文详细探讨了C++中的型别推导,包括模板型别推导的三个案例:指针或引用非万能引用、万能引用以及既不是指针也不是引用的情况。还介绍了型别推导的特殊场景,如对象列表初始化和函数返回值类型推导,并强调了使用`auto`的便利性。同时,讲解了`decltype`在不同表达式上的应用及其返回类型的特点。
最低0.47元/天 解锁文章
693





