• C++11特性-自动类型推导


    1.推导变量类型-auto

            在c++11中,可以使用auto自动推导变量的类型,也可以结合decltype来表示函数的返回值

            在使用auto时,必须初始化(auto 变量名= 变量值),以便编译器推导实际类型,在编译阶段,将auto占位符替换为真正的类型

    1. int temp = 1435;
    2. auto temp1 = temp;//int
    3. auto &temp2 = temp;//int&
    4. auto temp3 = &temp;//int*
    5. auto *temp4 = &temp;//int*

            当变量为指针或者引用时,推导结果会保留const、volatile关键字,否则不会保留这些关键字

    1. const auto a1 = temp;//const int
    2. auto a2 = a1;//int
    3. const auto &a3 = temp;//const int&
    4. auto &a4 = a3;//const int&
    5. const auto& a3 = temp;//const int&
    6. auto* a5 = &a1;//const int

            不能使用auto的场景:

                    1.不能作为函数参数使用

                    2.不能用于类的非静态成员变量初始化

                    3.不能定义数组

                    4.无法推导除模板参数

            推荐使用auto的场景:

                    1.遍历STL的容器

                    2.用于泛型编程(auto val= 调用模板函数的返回值)

    2.推导表达式类型-decltype

            decltype 表达式(不需要初始化),主要用于泛型编程

            推导规则:

                    1.当表达式为普通变量、普通表达式、类表达式,推导出来的类型与表达式的类型是一致的

    1. int x = 99;
    2. const int& y = x;
    3. decltype (x)a = x;//int
    4. decltype (y)b = x;//const int&
    5. decltype (Test::vasl)c = 10;//static const int
    6. Test t;
    7. decltype (t.str)d = "";//string

                    2.表达式是函数调用,推导出来的类型是函数的返回值类型

            当函数返回纯右值(字面量常量),对于纯右值,只有类类型可以携带const、volitile限定符能推导出来,除此之外要忽略此限定符

    1. int funcR() {}
    2. int& funcRR() {}//左值引用
    3. int&& funcRRR() {}//右值引用
    4. const int funcC() {}
    5. const int& funcCC() {}
    6. const int&& funcCCC() {}
    7. const Test funcT() {}
    8. decltype (funcR())aa1;//int
    9. decltype (funcRR())aa2 = x;//int &
    10. decltype (funcRRR())aa3 = 0;//int &&
    11. decltype (funcC())aa4;//int,返回纯右值(字面量)忽略const
    12. decltype (funcCC())aa5 = x;//const int&
    13. decltype (funcCCC())aa6 = 0;//const int&&
    14. decltype (funcT())aa7 = Test();//const Test

            3.表达式是一个左值(可以取地址的变量),或者被()包围,推导出来是表达式的引用,此情况下不能忽略const、volitile限定符

    1. const Test tt;
    2. //()表达式
    3. decltype (tt.num)bb1;//int-类表达示
    4. decltype ((tt.num))bb2 = x;//const int&
    5. cout << "bb2 = " << bb2 << endl;
    6. //+表达式
    7. int m = 44; int n = 55;
    8. decltype (m + n)cc1;//普通表达式-int
    9. decltype (m = m + n)cc2 = x;//int&

     3.返回类型后置

            auto func(参数1,参数2,·····)->decltype(表达式),auto会自动追踪decltype()推导的类型

    1. //R为返回类型,U、V为参数类型
    2. template<class R,typename U,class V>
    3. R add(U u,V v){
    4. return u + v;
    5. }
    6. //返回值类型后置 auto func(参数1,参数2,·····)->decltype(表达式)
    7. template<typename U, class V>
    8. auto add2(U u, V v) ->decltype(u+v){
    9. return u + v;
    10. }
    11. void test_auto_decltype() {
    12. int a = 4;
    13. double b = 4.5;
    14. //已知模板函数的实现,当你不知道模板函数的实现时,不能使用此方式
    15. auto ret = add<decltype(a + b), int, double>(a,b);
    16. //返回值类型后置 auto func(参数1,参数2,·····)->decltype(表达式)
    17. auto ret2 = add2<int, double>(a, b);
    18. auto ret2 = add2(a, b);
    19. }
  • 相关阅读:
    模板题:spfa求负环详解 虫洞
    Mysql - InnoDB引擎
    卡尔曼滤波器的推导
    Arduino红外循迹小车代码笔记和常见问题解决
    论文学习——Class-Conditioned Latent Diffusion Model For DCASE 2023
    SpringBoot2.0---------------5、SpringBoot自动配置原理
    Okapi Framework
    consul introduction
    图详解第四篇:单源最短路径--Dijkstra算法
    logback 将日志保存CSV文件
  • 原文地址:https://blog.csdn.net/weixin_44840658/article/details/128195384