zoukankan      html  css  js  c++  java
  • C++11新标准学习:decltype关键字

    1. decltype的意义

      有时我们希望从表达式的类型推断出要定义的变量类型,但是不想用该表达式的值初始化变量(初始化可以用auto)。为了满足这一需求,C++11新标准引入了decltype类型说明符,它的作用是选择并返回操作数的数据类型,在此过程中,编译器分析表达式并得到它的类型,却不实际计算表达式的值。

    2. decltype用法

    • (1) 基本用法

       1 int getSize();
       2  3 int main(void)
       4 {
       5     int tempA = 2;
       6     
       7     /*1.dclTempA为int.*/
       8     decltype(tempA) dclTempA;
       9     /*2.dclTempB为int,对于getSize根本没有定义,但是程序依旧正常,因为decltype只做分析,并不调用getSize().*/
      10     decltype(getSize()) dclTempB;
      11 12     return 0;
      13 }

      (2) 与const结合

       1 double tempA = 3.0;
       2     const double ctempA = 5.0;
       3     const double ctempB = 6.0 4     const double *const cptrTempA = &ctempA;
       5     
       6     /*1.dclTempA推断为const double(保留顶层const,此处与auto不同)*/
       7     decltype(ctempA) dclTempA = 4.1;
       8     /*2.dclTempA为const double,不能对其赋值,编译不过*/
       9     dclTempA = 5;
      10     /*3.dclTempB推断为const double * const*/
      11     decltype(cptrTempA) dclTempB = &ctempA;
      12     /*4.输出为4(32位计算机)和5*/
      13     cout<<sizeof(dclTempB)<<"    "<<*dclTempB<<endl;
      14     /*5.保留顶层const,不能修改指针指向的对象,编译不过*/
      15     dclTempB = &ctempB;
      16     /*6.保留底层const,不能修改指针指向的对象的值,编译不过*/
      17     *dclTempB = 7.0;

      (3) 与引用结合

       1 int tempA = 0, &refTempA = tempA;
       2  3     /*1.dclTempA为引用,绑定到tempA*/
       4     decltype(refTempA) dclTempA = tempA;
       5     /*2.dclTempB为引用,必须绑定到变量,编译不过*/
       6     decltype(refTempA) dclTempB = 0;
       7     /*3.dclTempC为引用,必须初始化,编译不过*/
       8     decltype(refTempA) dclTempC;
       9     /*4.双层括号表示引用,dclTempD为引用,绑定到tempA*/
      10     decltype((tempA)) dclTempD = tempA;
      11     
      12     const int ctempA = 1, &crefTempA = ctempA;
      13     
      14     /*5.dclTempE为常量引用,可以绑定到普通变量tempA*/
      15     decltype(crefTempA) dclTempE = tempA;
      16     /*6.dclTempF为常量引用,可以绑定到常量ctempA*/
      17     decltype(crefTempA) dclTempF = ctempA;
      18     /*7.dclTempG为常量引用,绑定到一个临时变量*/
      19     decltype(crefTempA) dclTempG = 0;
      20     /*8.dclTempH为常量引用,必须初始化,编译不过*/
      21     decltype(crefTempA) dclTempH;
      22     /*9.双层括号表示引用,dclTempI为常量引用,可以绑定到普通变量tempA*/
      23     decltype((ctempA))  dclTempI = ctempA;

      (4) 与指针结合

      1 int tempA = 2;
      2     int *ptrTempA = &tempA;
      3     /*1.常规使用dclTempA为一个int *的指针*/
      4     decltype(ptrTempA) dclTempA;
      5     /*2.需要特别注意,表达式内容为解引用操作,dclTempB为一个引用,引用必须初始化,故编译不过*/
      6     decltype(*ptrTempA) dclTempB;

    3. decltype总结

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

    1. auto忽略顶层const,decltype保留顶层const;

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

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

    4. auto推断时会实际执行,decltype不会执行,只做分析。总之在使用中过程中和const、引用和指针结合时需要特别小心。

    本文来自博客园,作者:Mr-xxx,转载请注明原文链接:https://www.cnblogs.com/MrLiuZF/p/14061525.html

  • 相关阅读:
    C++
    Qt简介
    C语言
    C/C++
    swagger2 Illegal DefaultValue null for parameter type integer
    maven包引入问题ClassNotFoundException: org.elasticsearch.client.Cancellable
    mysql自定义排序
    使用node创建服务器 运行vue打包的文件
    rsync实现服务器之间同步目录文件
    将jar包发布到maven的中央仓库细节整理
  • 原文地址:https://www.cnblogs.com/MrLiuZF/p/14061525.html
Copyright © 2011-2022 走看看