从我用来学习 C++ 的所有材料中,auto一直是一个奇怪的存储持续时间说明符,没有任何用途。但就在最近,我遇到了将它本身用作类型名称的代码。出于好奇,我尝试了它,它假定我碰巧分配给它的类型!
auto
突然之间,STL 迭代器以及任何使用模板的东西都变得更容易编写了 10 倍。感觉就像我在使用像 Python 这样的“有趣”语言。
我的一生都在哪里?你会说它是视觉工作室独有的还是不便携的,这会打破我的梦想?
auto是 C++ 从 C 中“继承”的一个关键字,它几乎永远存在,但实际上从未使用过,因为只有两个可能的条件:要么是不允许的,要么是默认假设的。
使用autoto 表示推导类型是 C++11 的新功能。
同时,从类型的auto x = initializer类型推导类型的方法与模板类型推导对函数模板的工作方式相同。考虑这样的函数模板:x``initializer
auto x = initializer
x``initializer
template<class T> int whatever(T t) { // point A };
在点 A 处,已T根据为参数传递的值分配了一个类型 to whatever。当你这样做auto x = initializer;时,相同的类型推导用于x从initializer用于初始化它的类型中确定类型。
T
whatever
auto x = initializer;
x
initializer
这意味着编译器需要实现的大多数类型推断机制auto已经存在并用于任何编译器上的模板,甚至尝试实现 C++98/03。因此,对于基本上所有的编译器团队来说,添加对 的支持auto显然相当容易——它添加得非常快,而且似乎也几乎没有与之相关的错误。
最初编写此答案时(在 2011 年,在 C++ 11 标准上墨迹未干之前)auto已经非常便携。如今,它在所有主流编译器中完全可移植。避免它的唯一明显原因是,如果您需要编写与 C 编译器兼容的代码,或者您有特定的需要针对一些您知道不支持它的利基编译器(例如,仍然有一些人编写代码对于 MS-DOS,使用 Borland、Watcom 等的编译器,几十年来没有出现重大升级)。如果您使用的是任何主流编译器的合理当前版本,那么完全没有理由避免它。
该标准的最新修订版增加了一些auto可以使用的新地方。从 C++14 开始,您可以使用autolambda 的参数类型:
[](auto s) { return s + 1; }
这与上面的示例基本相同——尽管它没有明确使用template语法,但这基本上是一个模板,它推断参数的类型,并在该类型上实例化模板。
template
这非常方便和有用,以至于在 C++20 中,为普通函数添加了相同的功能,而不仅仅是 lambda。
但是,就像以前一样,所有这些实际上都归结为使用自 C++98 以来我们用于函数模板的相同基本类型推导机制。auto允许它在更多地方使用,更方便,但底层的繁重工作保持不变。