目录
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 和 继承中。