C++新特性之auto指定符

C++11发布之前,C++定义变量必须指定变量的类型,不像拥有“类型自动推断”技术的语言,比如python。当C++11发布后,C++也拥有了“类型自动推断”技术,即auto关键字和decltype关键字。我们在这里描述auto关键字的用法。

语法

//变量
1. auto variable initializer        //从其初始化器自动推导变量类型

//函数
2. auto function -> return type     //从尾随的返回类型推导,事实上这里的auto只是语法作用,并不进行自动类型检测。

3. auto function                    //从return语句推导

4. template <auto Parameter> (c++17)//类型由对应使用的参数推导

举例

#include <iostream>

template <class T,class U>
auto add(T t,U u) { return t+u; }   //返回类型是operator+(T,U)的类型。

//目前vs2017还不支持
template <auto n>
auto f() -> std::pair<decltype(n),dcltype(n)>
{
    return {n,n};
}

int main()
{
    auto a=1+2;         //a的类型是int
    auto b=add(1,1.2);  //b的类型是double

    auto c={1,2};       //c的类型是std::initalizer_list<int>
    auto d=f<1>)();     //结构化绑定声明 (vs2017不支持)

    int &e=a;
    auto g=e;           //此时g的类型为int,而不是int&

    const int h=100;
    auto i=h;           //i的类型为int,而不是const int(去除const)
    const auto j=h;     //j的类型此时为const int

    //如果auto关键字带上&号,则不去除const语意
    auto &k=h;          //k的类型为const int

    auto l[3]={1,2,3};
    auto m=l;           //m的类型为int*
    //若表达式为数组且auto带上&,则推导类型为数组类型。
    auto &n=l;          //n的类型为int[3]
}

总结

  1. auto 定义变量一定要进行初始化。
  2. 如果初始化表达式是引用,则去除引用语义。
  3. 如果初始化表达式为constvolatile(或者两者兼有),则除去const/volatile语义。
  4. 初始化表达式为数组时,auto关键字推导类型为指针。
  5. 函数的参数不能使用auto,在不支持C++17标准的编译器上模板参数也不能使用auto

猜你喜欢

转载自blog.csdn.net/u013635579/article/details/82598552