zoukankan      html  css  js  c++  java
  • C++11常用特性介绍——decltype关键字

    一、decltype的意义

      有时我们只想从表达式的类型推断出要定义的变量类型,但是不想用其值进行初始化的时候,C++11新标准引入了decltype类型说明符,它的作用是选择并返回操作数的数据类型,在此过程中,编译器分析表达式并得到它的类型,却不实际计算表达式的值。

    二、decltype的用法

      1)基本用法

      int getInt();

      int main()

      {

        int a = 1;

        decltype(a) b;     //b为int类型。

        decltype(getInt()) c; //c为int类型,即使getInt()根本没定义,但程序依旧正常,因为decltype只做分析,并不调用getInt()

        return 0;

      }

      2)与const结合

      const int a= 0, &b = a;

      decltype(a) c = 0;  //c为const int类型,必须初始化

      decltype(b) d = c;  //d为const int&类型,必须初始化

      decltype(b) e;     //错误,e为const int&类型,必须初始化

      注:从上面的例子可以看出,decltype不会忽略顶层的const,而是保留,这是和auto的一个区别。

      3)与引用结合

      int a = 1,*b = &a,&c = a;

      decltype(a) d = 0;  //d为int类型

      decltype(b) e = &d;  //e为int*类型

      decltype(*b) f = d;    //f为int&类型(表达式内容为解引用操作,可以这么理解,b是指针,而对*b的操作会影响到d的值,和引用功能相同)

      decltype(c) g = d;  //g为int&类型

      decltype(c+1) h = d;   //h为int类型,c的类型为int&,但是c+1表达式计算之后返回的类型是int,因此h的类型是int

      std::cout << d << std::endl;  //输出0(输出d的值)

      std::cout << ++(*e) <<std::endl;//输出1(d先自加1变为1,再输出)

      std::cout << ++f  <<std::endl;    //输出2(d先自加1变成2,再输出)

      std::cout << ++g << std::endl;   //输出3(d先自加1变成3,再输出)

      std::cout << ++h << std::end;    //输出1(h先自加1变成1,再输出)

      4)与括号

      int a = 1;

      decltype((a)) b = 2;//b为int&类型,必须初始化

      注:如果一个表达式的类型不是引用,但是我们需要推断该类型的引用,那么可以加上一对括号,就变成了引用类型。

      5)与函数返回类型

      template <typename T1,typename T2>  

      auto Func(T1 t1,T2 t2> -> decltype(t1 * t2)

      {

        return t1 * t2;

      }

      6)总结

      decltype和auto都可以用来推断类型,但二者有几处明显的差异:

      1、auto忽略顶层const、decltype保留顶层const。

      2、对引用操作,auto推断原有类型;decltype推断出引用。

      3、对解引用的操作,auto推断出原有类型;decltype推断出引用。

      4、auto推断时会实际执行,decltype不会执行,只做分析。

  • 相关阅读:
    pandas 数据结构基础与转换
    Python 基础常用
    css 横向滚动条webkit-scrollbar
    hive mysql 初始化
    hive 的理解
    hive 踩坑
    hbase 调试各种报错
    hbase shell常用命令
    mysql 性能测试工具 mysqlslap
    【CDH学习之一】CDH简介
  • 原文地址:https://www.cnblogs.com/zhangnianyong/p/11896932.html
Copyright © 2011-2022 走看看