美文网首页C++基础知识
关键字auto的前世今生-未完

关键字auto的前世今生-未完

作者: 安然_fc00 | 来源:发表于2017-03-21 22:52 被阅读3次

    一. 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();
    

    相关文章

      网友评论

        本文标题:关键字auto的前世今生-未完

        本文链接:https://www.haomeiwen.com/subject/nsqnnttx.html