• c++11的类型推导auto使用


    c++11的类型推导auto使用

    c++11新特性,最先提到的肯定是类型推导,c++引入了auto和deltype关键字,使用他们在编译期就能推导出变量或者表达式的类型,方便开发也简化代码。

    一、auto:
    auto可以让编译器在编译期就推导出变量的类型,auto基本用法,类似.NET中的var

    auto a=1; //1是int,可以自动推导出a是int
    int b=2;
    auto c=b;//推导出c是int类型
    auto d=2.0;//d是double类型
    
    • 1
    • 2
    • 3
    • 4

    auto的使用规则:
    1)auto使用时必须马上初始化,否则无法推导出类型
    2)auto在一行定义多个变量,各变量推导不能产生二义性,否则编译失败,意思就是多个变量类型保持一致
    3)auto不能定义数组,可以定义指针
    4)在类中auto不能用作非静态成员变量
    5)auto不能用作函数参数
    6)auto无法推导出模版参数

    auto j;//错误,auto使用必须马上初始化
    auto d=0,f=1.0;//报错 error,d,e不是同种类型,对于编译器有二义性,没法推导
    int i=1;
    auto a=i,&b=i,*c=&i;//a是int,b是i的引用,c是指针,auto就相当于int
    
    • 1
    • 2
    • 3
    • 4

    函数中auto使用规则

    void func(auto value) {} // error,auto不能用作函数参数
    
    class A {
        auto a = 1; // error,在类中auto不能用作非静态成员变量
        static auto b = 1; // error,这里与auto无关,正常static int b = 1也不可以
        static const auto c = 1; // ok
    };
    
    void func2() {
        int a[10] = {0};
        auto b = a; // ok
        auto c[10] = a; // error,auto不能定义数组,可以定义指针
        vector<int> d;
        vector<auto> f = d; // error,auto无法推导出模板参数
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    int i = 0;
    auto *a = &i; // a是int*
    auto &b = i;//b是int&
    auto c = b;//c是int,忽略了引用
    
    const auto d = i;//d 是const int
    auto e = d;//e是int
    
    const auto& f = e;//f是const int&
    auto &g = f;//g是const int&
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    auto与const和volatile的结合使用方法:
    1)在不声明为引用或指针时,auto会忽略等号右边的引用类型和cv限定
    2)在声明为引用或者指针时,auto会保留等号右边的引用和cv属性

    二、decltype
    auto用于推导变量类型,而decltype则用于推导表达式类型,这里只用于编译器分析表达式的类型,表达式实际不会进行运算,代码:

    int func(){return 0;}
    decltype(func()) i;//i为int类型
    
    int x=0;
    decltype(x) y;//y是int类型
    decltype(x+y) z;//z 是int类型
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    注意:decltype不会像auto一样忽略引用和cv属性,decltype会保留表达式的引用和cv属性

    const int &i = 1;
    int a = 2;
    decltype(i) b = 2; // b是const int&
    
    • 1
    • 2
    • 3

    decltype推导规则
    对于decltype(exp)有
    1)exp是表达式,decltype(exp)和exp类型相同
    2)exp是函数调用,decltype(exp)和函数返回值类型相同
    3)其它情况,若exp是左值,decltype(exp)是exp类型的左值引用

    int a = 0, b = 0;
    decltype(a + b) c = 0; // c是int,因为(a+b)返回一个右值
    decltype(a += b) d = c;// d是int&,因为(a+=b)返回一个左值
    
    d = 20;
    cout << "c " << c << endl; // 输出c 20
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    服装PLM解决方案能带给企业什么?
    [C语言基础]文件读取模式简析
    刻字机尖角补偿
    华为数通方向HCIP-DataCom H12-821题库(单选题:341-360)
    嫁给程序员老公,我后悔了
    学生环境保护绿色家园 WEB静态网页作业模板 大学生环境保护网页代码 dreamweaver网页设计作业制作 dw个人网页作业成品
    消息发送机制梳理
    Python编程 字符串的方法
    聚类算法以及聚类算法模型评估的介绍
    Java项目:JSP健身房管理系统
  • 原文地址:https://blog.csdn.net/lzz555517/article/details/126884120