• auto和decltype


    • auto

    1.编译器通过分析表达式的类型来确定变量的类型,所以auto定义的变量必须有初始值

    auto i=10;                      //ok,i为整型
    
    auto j;                        //error,定义时必须初始化。
    j=2;    

    2.auto可以在一条语句中声明多个变量,但该语句中所有变量的初始值类型必须有一样。

    auto i=0,*P=&i;             //ok,i是整数,p是整型指针
    auto a=2,b=3.14;             //error,a和b类型不一致

    3.auto会忽略掉顶层const,同时底层const则会保留下来

    const int a=2,&b=a;
    auto c=a;            //c是int 型,而不是const int,即忽略了顶层const
    auto d=&a;           //d是一个指向const int 的指针,即保留了底层const

    如果希望auto类型是一个顶层const ,需要明确指出:

    const auto e=a;      //e是const int 类型

    4.当使用数组作为auto变量的初始值时,推断得到的变量类型是指针,而非数组

    int a[10]={1,2,3,4,5,6,7,8,9,0}
    auto b=a;             //b是int *类型,指向数组的第一个元素
    
    int c[2][3]={1}
    auto d=c;           //d是int(*d)[3]类型的数组指针
    for(auto e:c)        //e是int*类型,而不是int(*)[3]
    for(auto &f:c)       //f是int(&f)[3]
    //**************************************************
    decltype (a) c;      //c是由10个整型数构成的数组,c[10]
    • decltype

    decltype和auto功能类型,但略有区别:

    1.decltype根据表达式类型确定变量类型,但不要求定义时进行初始化

    int a=2;
    decltype (a) b;            //b是int类型
    b=3;
    int &c=a;
    decltype (c) d=a;          //d为int &类型,因此定义时必须初始化

    2.解引用指针操作将得到引用类型

    int a=2,*b=a;
    decltype (*b) c=a;               //解引用,c是int &类型,因此必须初始化

    3.decltype所用的表达式加()得到的是该类型的引用

    int a=2;
    decltype ((a)) b=a;     //b是int&类型,而不是int类型,必须初始化
    decltype (a) c;             //c是int类型

    4.decltype所用变量时数组时,得到的同类型的数组,而不是指针

    int a[2]={1,2}
    decltype (a) b={3,4}   //int b[2]类型

     5.decltype所用变量是函数时,得到的是函数类型,而不是函数指针

    int fun(int a);
    decltype(fun) *f();        //函数f返回的是 int(*)(int),即函数指针,而decltype(fun)是int(int)类型
  • 相关阅读:
    iOS 适配iPhoneX上tableHeaderView发生了高度拉伸、UI出现的空白间距
    无线加密WEP、WPA、WPA2及TKIP、AES
    字符替换操作
    jQuery版本升级问题汇总
    ipv6服务器及环境搭建
    git删除某次提交操作
    五种IO模型
    jQuery1.6以上attr改用prop
    线程创建pthread_create用法(转)
    网络字节序与主机字节序
  • 原文地址:https://www.cnblogs.com/mrlsx/p/5552429.html
Copyright © 2020-2023  润新知