一. auto的前世今生
《C++Primer Plus》中这样描述auto
在C语言和C++11版本之前的C++中,关键字auto用于显式地指出变量为自动存储:
int froob(int n)
{
auto float forf; //ford has automatic storage
}
由于只能将关键字auto用于默认为自动的变量,因此程序员几乎不使用它。它的主要用途是指出当前变量为局部自动变量。
在C++11中,这种用法不再合法。制定标准的人不愿引入新关键字,因为这样可能导致将该关键字用于其他目的的代码非法。考虑到auto的老用法很少使用,因此赋予其新含义比引入新关键字是更好的选择。
C++11新增了一个工具,让编译器能够根据初始值的类型判断变量的类型。为此重新定义了auto。在初始化声明中,如果使用关键字auto,而不指定变量的类型,编译器将把变量的类型设置成与初始值相同:
auto n=100; //n is int
auto x=1.5; //x is double
auto y=1.3e12L; //y is long double
自动推断类型并非为这种简单情况设计的;实际上,如果将其用于这种简单情形,甚至可能让你误入歧途。比如假设你要将x,y,z都指定为double类型,并编写了代码:
auto x=0.0; //x is double because 0.0 is double
double y=0; //0 automatically converted to 0.0
auto z=0; // z is int because 0 is int
显式地声明类型时,将变量初始化为0(而不是0.0)不会导致任何问题,但采取自动类型推断时,却会导致问题。
二. auto真正的用武之地-未完
处理复杂类型,如STL中的类型时,auto的功能有时才能显现出来。例如对于以下代码:
std::vector<double> scores;
std::vector<double> ::iterator pv = cores.begin();
C++允许这样做
std::vector<double> scores;
auto pv = scores.begin();
网友评论