C++类型推断

本文深入探讨了C++中的类型推断,包括模板类型推断、auto关键字和decltype的使用。介绍了模板类型推断的三种情形:指针或引用类型、通用引用类型(&&)及非指针非引用类型,并通过示例详细解释了每种情况下的类型推断规则。此外,还讨论了auto关键字在变量定义、函数返回类型和泛型表达式中的类型推断,以及decltype关键字在获取表达式类型的用法,特别是其在函数模板返回类型推断中的重要作用。
摘要由CSDN通过智能技术生成

C++类型推断

对于静态语言来说,你一般要明确告诉编译器变量或者表达式的类型。但是庆幸地是,现在C++已经引入了自动类型推断:编译器可以自动推断出类型。在C++11之前,类型推断只是用在模板上。而C++11通过引入两个关键字autodecltype扩展了类型推断的应用。C++14更进一步扩展了autodecltype的应用范围。明显地,类型推断可以减少很多无必要的工作。但是高兴之余,你仍然有可能会犯一些错误,如果你不能深入理解类型推断背后的规则与机理。因此,我们分别从模板类型推断、autodecltype的使用三个方面深入讲解类型推断。

模板类型推断

模板类型推断在C++98中就已经引入了,它也是理解autodecltype的基石。下面是一个函数模板的通用例子:

template <typename T>
void f(ParamType param);

f(expr);   // 对函数进行调用

编译器要根据expr来推断出TParamType的类型。特别注意的是,这两个类型有可能并不相同,因为ParamType可能会包含修饰词,比如const&。看下面的例子:

template <typename T>
void f(const T& param);

int x = 0;
f(x);   // 使用int类型调用函数

此时类型推断结果是:T的类型是int,但是ParamType的类型却是const int&。所以,两个类型并不相同。还有,你可能很自然地认为T的类型与表达式expr是一样的,比如上面的例子:两者是一样的。但是实际上这也是误区:T的类型不仅取决于expr,也与ParamType紧紧相关。这存在三种不同的情形:

情形1:ParamType是指针或者引用类型

最简单的情况ParamType是指针或者引用类型,但不是通用引用类型(&&)。此时,类型推断要点是:

  1. 如果expr是引用类型,那就忽略引用部分;
  2. 通过相减exprParamType的类型来决定T的类型。

比如,下面是引用类型的例子:

template <typename T>
void f(T& param);  // param是引用类型

int x = 27;      // x是int类型
const int cx = x;  // cx是const int类型
const int& rx = x;   // rx是const int&类型

f(x);   // 此时T为int,而param是int&
f(cx);  // 此时T为const int,而param是const int&
f(rx);  // 此时T为const int,而param是const int&

其中可以看到,const对象传递给接收T&参数的函数模板时,const属性是能够被T所捕获的,即const称为T的一部分。同时,引用类型对象的引用属性是可以忽略的,并没有被T所捕获。上面处理的其实是左值引用,对于右值引用,规则是相同的,但是右值引用的通配符T&&还有另外的含义,会在后面讲。

如果param是常量引用类型,推断也是相似的,尽管有些区别:

template <typename T>
void f(const T& param);  // param是常量引用类型

int x = 27;      // x是int类型
const int cx = x;  // cx是const int类型
const int& rx = x;   // rx是const int&类型

f(x);   // 此时T为int,而param是const int&
f(cx);  // 此时T为int,而param是const int&
f(rx);  // 此时T为int,而param是const int&
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值