C++11 新特性之类型推断与类型获取

C++11新特性之新类型与初始化: http://blog.jobbole.com/102728/

这是C++11新特性介绍的第二部分,涉及到C++11这次更新中较为重要的特性类型推断(auto)与类型获取(decltype)。
不想看toy code的读者可以直接拉到文章最后看这部分的总结。

简单的类型推断

C++11新标准中增加了auto类型说明符,可以让编译器帮我们分析表达式的类型。

需要注意的是:

  1. 使用auto定义的变量必须有初始值,不然无法进行类型推断
  2. 在同一条语句中使用auto定义的变量,其基础类型必须一致

const 和 auto

auto在进行类型推断时,一般会忽略顶层const(top-level const),而保留底层const(low-level const)。如果想要保留顶层const,则必须显式的在auto前添加const指示符。

所谓顶层const,指的是当前的数据类型本身是常量,如double,int或者相关的指针本身是常量;

而底层const,指的是如指针、引用等复合类型,其所指向的数据类型是常量。

当定义一个auto的引用时,顶层const被保留,如上述测试代码中的aval12所示。另外,输出的结果中,有些数值可能和预想的不太一样,可以思考一下是为什么^_^(Tips: 和引用有关)。

类型获取 decltype

decltype(expr)可以获得expr表达式对应的类型,并且不会对expr具体求值。

decltype与const

decltype处理const的方式与auto不同。

  1. 如果decltype中的表达式是一个变量,那么返回该变量的类型(包括顶层const)
  2. 如果decltype中的表达式不是变量,则返回该表达式结果对应的类型。

看上去没啥区别?其实这里的规则导致了decltype(r+0) decltype((i))这种诡异的写法。还是具体看代码吧。

上面代码中需要注意的地方有:

  1. val21处,如果decltype中的表达式是一个解引用操作,那么将得到一个引用类型,所以必须初始化。
  2. val22处,rval6是一个引用类型(double&),如果我们需要获得这个引用的基础类型(即double),那么使用rval6 + 0这样一个表达式,显然这个表达式的结果将不是引用了。
  3. val23和val24处,如果decltype中的变量加上了括号,那么就会被当作表达式处理;而变量是一种可以作为左值被赋值的特殊表达式,因此decltype对于这种带括号的变量(val23处),就会得到一个引用类型。

使用 auto 缩写类型

不用费劲写string::size_type了^o^

使用 auto 简化声明

声明指向数组的指针总是一件令人痛苦的事情:

有了auto之后,我们可以像下面这样清爽:

使用 decltype 简化函数返回类型

如果我们已经知道某个函数会返回什么对象,然而这个对象又是一个类型复杂不好写的对象,那么decltype就可以派上用场了。

使用auto动态分配内存

auto可以和new配合,来动态分配内存,并进行初始化。

这里有几处需要留意的地方:

  1. val29处,只是new出了一个指向数组的指针,并没有复制数组的值。因此在下面循环中打印出的p值(地址)和odd数组的地址是一样的。
  2. 不可以使用auto来分配一个动态数组。这是因为使用new分配数组时,不支持圆括号的初始化方式,只支持花括号的列表初始化方式。

总结

  1. 可以使用auto说明符,让编译器帮我们推断类型。
  2. auto在进行类型推断时,一般会忽略顶层const(top-level const),而保留底层const(low-level const)。
  3. decltype(expr)可以获得expr表达式对应的类型,并且不会对expr具体求值。
  4. decltype(rval + 0)可以获得值类型(非引用),decltype(*p)获得引用类型,decltype((val))获得引用类型。
  5. 使用auto可以缩写一些复杂难写的类型。
  6. 使用auto可以简化类型声明,尤其是数组和指针混合的声明。
  7. 在知道某一函数会返回什么对象时,可以使用decltype可以简化函数返回类型。
  8. auto和new可以配合以动态分配内存,但是不能用于动态分配数组。

完整代码详见 auto_decltype.cpp

打赏支持我写出更多好文章,谢谢!

打赏作者

打赏支持我写出更多好文章,谢谢!

任选一种支付方式

3 3 收藏 3 评论

关于作者:usher2007

游戏开发 C/C++ Python Linux 个人主页 · 我的文章 · 11 ·    

相关文章

可能感兴趣的话题



直接登录
最新评论
  • 果理 C++开发工程师 2016/08/15

    作者主要介绍了auto和decltype的用法,还有对其中的一些机制原理也有一定较为详细的介绍。我觉得对decltype的机制原理介绍的有些简单,希望能再详细一点就更好了!

    如果decltype中的表达式不是变量,则返回该表达式结果对应的类型。这句话该如何理解呢?

    • b是一个int类型的变量。

      c是对b的引用。

  • 熊猫Tony   2016/08/23

    请问一个有关类型推断的问题:如果我有个自定义的类 class A,这个类没有定义operator +之类的运算符,我有一个这个类的引用ra,不能写decltype(ra+0),那有什么替代方法?给个示范代码。谢谢!

跳到底部
返回顶部