• A.7 自动推导变量类型

    A.7 自动推导变量类型

    C++是静态语言:所有变量的类型,都会在编译时被准确指定。所以,作为程序员你需要为每个变量指定对应的类型。有些时候就需要使用一些繁琐类型定义,比如:

    1. std::map<std::string,std::unique_ptr<some_data>> m;
    2. std::map<std::string,std::unique_ptr<some_data>>::iterator
    3. iter=m.find("my key");

    常规的解决办法是使用typedef来缩短类型名的长度。这种方式在C++11中仍然可行,不过这里要介绍一种新的解决办法:如果一个变量需要通过一个已初始化的变量类型来为其做声明,那么就可以直接使用auto关键字。这样,编译器就会通过已初始化的变量,去自动推断变量的类型。

    1. auto iter=m.find("my key");

    当然,auto还有很多种用法:可以使用它来声明const、指针或引用变量。这里使用auto对相关类型进行了声明:

    1. auto i=42; // int
    2. auto& j=i; // int&
    3. auto const k=i; // int const
    4. auto* const p=&i; // int * const

    变量类型的推导规则是建立一些语言规则基础上:函数模板参数。其声明形式如下:

    1. some-type-expression-involving-auto var=some-expression;

    var变量的类型与声明函数模板的参数的类型相同。要想替换auto,需要使用完整的类型参数:

    1. template<typename T>
    2. void f(type-expression var);
    3. f(some-expression);

    在使用auto的时候,数组类型将衰变为指针,引用将会被删除(除非将类型进行显式为引用),比如:

    1. int some_array[45];
    2. auto p=some_array; // int*
    3. int& r=*p;
    4. auto x=r; // int
    5. auto& y=r; // int&

    这样能大大简化变量的声明过程,特别是在类型标识符特别长,或不清楚具体类型的时候(例如,调用函数模板,等到的目标值类型就是不确定的)。