C++ 中的型别推导

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++ 中的型别推导

1. 模板型别推导

对于以下函数模板和调用

// 函数模板
template<typename T>
void func(ParamType param);

// 调用模板函数
func(expr);

编译器会在编译期通过 expr 推导两个型别:TParamType。比如

// 函数模板
template<typename T>
void func(const T& param);

// 模板函数调用
int i = 0;
func(i);

T 被推导为 intParamType 被推导为 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)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值