<p id="main-toc">自动类型推断(Automatic Type Inference)是指编程语言在编译时自动根据上下文推导变量的类型,而无需显式指定变量的类型。</p>
讯享网
在C++ 11中,自动类型推断是通过关键字来实现的。
大多数情况下,我们都是使用auto声明定义局部变量的,形式如下所示:
讯享网
除上例之外,
结论:
- 当变量是指针或引用类型时,auto推导结果会保留const、volatile属性
- 当变量不是指针或引用类型时,auto推导结果中不会保留const、volatile属性
在这里,对字符串类型变量需要说明一下,因为使用字符串初始化的auto类型变量,通常会被推导成const char *类型。但是有时候我们还想让auto类型推导成std::string类型,那么只需要初始化的字符串的末尾追加s符号标注即可,如下:
讯享网
使用的auto声明定义的局部变量,经常被使用在基于范围的 for 循环中遍历容器、数组等当中的元素,如下:
关于此用法的详细说明,请参考
C++中,全局变量分为两种:外部全局变量和静态局部变量。
1.2.1 外部全局变量
C++中,为了避免在不同的源文件中出现重复定义的问题,外部全局变量会被声明为extern,然后实现在另一个文件中进行定义实现。
在C++ 11中,外部全局变量是不能被定义成auto类型的。如下定义会在编译期间报错的。
讯享网
1.2.2 静态全局变量
我们再说说静态全局变量,它是指在一个文件中定义的全局变量,是由static定义的变量。它的生命周期会持续到程序的结束,并且只能在当前文件中访问。
在C++ 11中,静态全局变量是可以定义成auto类型的。在编译期间,它的类型会根据给定的初始值推导出真正的类型。如下示例:
C++中,类成员变量分为两种:静态成员变量和非静态成员变量。
1.3.1 静态成员变量
由于类的静态成员变量在声明定义时,不能给定一个初始值,无法推导出类型,所以它无法被定义成auto类型。如下示例:
讯享网
1.3.2 非静态成员变量
对于非静态成员变量,由于能够给定初始值,我本认为是可以使用auto关键来进行声明定义的,但是事实上非静态成员变量被声明auto类型后,编译阶段就会报错。所以所以它无法被定义成auto类型。如下示例:
1.3.3 静态常量
在类中,虽然无论是静态成员变量或是非静态成员变量都不能被定义成auto类型,但是类的静态常量确是可以使用auto来声明定义的。需要注意,一般情况下,使用const关键字只能声明定义 int 类型的常量,若想定义声明其它类型的静态常量时,可使用C++ 11新引入的 constexpr 关键字来定义声明。如下所示:
讯享网
在C++ 11中,无论是函数的返回值还是函数参数都是不能被定义成auto类型的,但从C++ 14后就支持了这种特性。
从C++ 14后,对于任何函数及类中的成员函数的返回值都可定义成auto类型,但是对类中的虚函数(virtual定义)的返回值是不能够使用auto类型的。
在C++ 14中,关于函数auto类型返回值的推导,我们经常会遇到以下几种情况:
- 返回数据的类型一致
编译成功,输出结果:
讯享网
- 返回数据的类型不一致
编译成功,输出结果:
讯享网
但是,我发现一个很奇怪的问题,如果将上例函数中的三目运算符修改成使用 if 语句检查判断,用多个return语句返回不同类型的数据时,就会发生编译错误。如下:
如何解决这种问题呢?可以直接使用三目运算符解决,也可以使用“后置返回值类型”声明返回值的类型。如下:

讯享网
编译成功,输出结果:
在C++14中引入的“泛型Lambda表达式”,它可以将参数声明定义成auto类型,实现函数参数类型的自动推导。如下示例:
讯享网
3.1.1 简化变量类型的声明
使用auto可以省去手动指定变量类型的麻烦。编译器会根据初始化表达式的类型来推断出变量的类型,使代码更简洁。
特别适用于处理复杂或模板化的类型,因为它消除了在代码中显式声明冗长或冗余类型名称的需要。例如:
讯享网
使用auto声明后:
3.1.2 支持复杂类型的推断
auto可以推断复杂的类型,例如模板类型、迭代器类型和lambda表达式类型。
讯享网
3.1.3 提高代码的灵活性和重构能力
使用auto可以避免重复修改变量声明的类型,尤其是在复杂的类型改变时。这样可以提高代码的重构能力和可维护性。
尤其在使用auto定义泛型的时候,大大提高了代码灵活性和使用上的复杂性,例如不使用auto的情况下,定义一个模板:
讯享网
在使用auto的情况下,代码可以修改成以下样式:
在使用C++ 11 auto关键字声明定义的时修,也是有制限的。
- 不能用于作为函数参数的声明
讯享网
- 不能用于类中静态常量之外的变量的声明
- 不能用于定义数组
讯享网
- 不能用于推导出模板参数
总而言之,auto是C++ 11引入的功能之一,它可以帮助简化代码、减少冗余,并提高编写和维护代码的效率。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/141435.html