C++11新特性——auto和decltype类型推导

        C++11新标准引入auto类型说明符,可以让编译器帮我们分析表达式所属的类型,通过初始值推算变量的类型。auto定义的变量必须有初始值。使用auto也能在一条语句中声明多个变量。因为一条声明语句只能有一个数据类型,所以该语句中所有变量的基础数据类型必须相同。

        编译器推断出来的auto类型有时候和初始值的类型并不完全一样,编译器会适当的改变结果类型时期更符合初始化规则。比如,使用引用其实是使用引用的对象,特别是当引用被用作初始值时,真正参与初始化的其实是引用对象的值。此时编译器会以引用对象的类型作为auto的类型:

      int i = 0,&r = i;
      auto a = r;   // a是一个整数(r是i的别名,i是一个整数)

        auto一般会忽略顶层const(top-levelconst),保留底层const(low-level const),顶层const指变量本身是个常量,而底层const指变量所指的对象是个常量。比如:

    int i = 0;
    int *const p1 =&i; // 不能改变p1的值,顶层const
    const int ci =42;  // 不能改变ci的值,顶层const
    const int *p2 =&ci; // 可以改变p2的值,底层const
    const int *constp3 = p2; // 前面是底层const,后面是顶层const
    const int &r= ci; // 用于声明引用的const都是底层const

auto一般会忽略顶层const,保留底层const:

   const int ci = i, &cr = ci;
   auto b = ci;  // b是一个整数(ci的顶层const被忽略)
   auto c = cr;  // c是一个整数(cr是ci的别名,ci本身是顶层const,被忽略)
   auto d = &i;  // d是一个整数指针
   auto e = &ci;  //e是一个指向整数常量的指针(对常量对象去地址是一种底层const)

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

         const auto f = ci;

设置一个类型为auto引用时,初始值的顶层常量属性仍然保留。

 

        decltype类型指示符:返回操作数的数据类型,不实际计算表达式的值。decltype处理顶层const和引用的方式与auto不同。如果decltype使用的表达式是一个变量,则返回该变量类型(包括顶层const和引用)。如果decltype使用的表达式不是一个变量则返回表达式结果对应的类型。如果表达式内容是解引用操作,则decltype将得到引用类型。如果变量名加上括号,则得到的类型与不加括号不同,不加括号返回变量的类型,加括号得到引用类型。切记:decltype((variable))(注意是双层括号)的结果永远是引用,而decltype(variable)结果只有当variable本身就是一个引用时才是引用。

        使用auto可以缩写类型,简化声明。

        auto可以和new配合,动态分配内存,并进行初始化,即括号内加初始化器。不可以使用auto来分配一个动态数组。这是因为使用new分配数组时,加括号初始化时,括号内不能有初始化器,而使用auto动态分配内存,需要提供一个括号包围的初始化器,且括号内只能有一个初始化器,从而推断出类型。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值