【C++】类型推导 --(auto、decltype、typeof、typeid)

本文深入探讨了C++中的自动类型推导机制,包括auto关键字的使用,如与const的结合、混合类型应用及限制。同时,详细阐述了decltype的功能,如何根据表达式推导类型,并分析了其与const的关系。最后,介绍了typeid运算符在运行时类型信息获取中的应用,以及其在不同场景下的行为特点。
摘要由CSDN通过智能技术生成

目录

1. auto

(1)auto与const结合:

(2)auto和某些具体类型的混合使用:

(3)auto的限制:

(4)auto的应用:

2. decltype

(1)decltype 与 const:

(2)decltype的推导:

3. typeof

4. typeid

(1)typeid的使用:


1. auto

       auto是一个占位符,因此auto定义的变量必须有初始值。

       编译器在编译期间自动推导出变量的类型,并适当地改变结果类型使其更符合初始化规则。

(1)auto与const结合:

       ① 当类型不为引用时,auto的推导结果将不保留表达式的const属性; 

       ② 当类型为引用时,auto的推导结果将保留表达式的顶层const属性(初始值绑定引用时的常量不是顶层常量)。

       ③ auto一般会忽略掉顶层const,保留底层const。若想推出顶层const的auto类型需要明确指出。

(2)auto和某些具体类型的混合使用:

       ① 此时auto表示“半个”类型,而非完整的类型。

       ② 当 = 的右侧表达式为引用类型时,auto会抛弃引用,直接推导出它的原始类型。

(3)auto的限制:

       ① auto不能在函数参数中使用(函数定义只声明并指明参数类型,未赋值);

       ② auto不能用于类的非静态成员变量(即:没有static修饰的成员变量);

       ③ auto 关键字不能定义数组;

       ④ auto 不能作用于模板参数

(4)auto的应用:

       使用auto定义迭代器、泛型编程。

2. decltype

       decltype 在编译时期进行自动类型推导。用法如下:

 

       ① decltype 根据exp推导变量的类型,跟=右边的value没有关系。exp可以是变量、字面量、带有运算符的表达式。

       ② 不需要变量初始化,但必须要保证exp的结果有类型,不能为void。

(1)decltype 与 const:

       ① decltype 可返回的变量类型,包括顶层const和引用。

(2)decltype的推导:

       ① 若exp是不被括号()包围的表达式,或一个类成员访问表达式,或单独的变量,则decltype(exp)的类型和exp一致;

       ② 若exp是函数调用,则decltype(exp)的类型和函数返回值的类型一致;

       ③ 若exp是左值,或被括号()包围,则decltype(exp)的类型是 &exp。

3. typeof

       推导参数(表达式或类型)的类型,且不计算表达式的值;(C语言);

       typeof构造中的类型名不能包含存储类说明符(eg:extern、static);可以包含类型限定符(eg:const、volatile)

4. typeid

       typeid是RTTI提供的运算符,用法如下:

(1)typeid的使用:

       ① 若表达式有顶层const,则顶层const被忽略;

       ② 若表达式是一个引用,则返回该引用所引对象的类型;

       ③ 若表达式是数组或函数,则不会进行向指针类型的隐式转换,返回数组类型而非指针类型。

       ④ 可用于动态类型(运行时),也可用于静态类型(编译时)。eg:当类型含有虚函数时,编译器会对表达式求值后返回。(注意:出现typeid(*p)时,动态类型可能与静态类型不同,则必须在运行时明确表达式求值的类型)

       ⑤ 多数用于class 和 继承中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值