定义:

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

decltype(f()) sum = x ;  // sum的类型就是函数f的返回类型

decltype和顶层const、引用:

如果decltype使用的表达式是一个变量,则decltype返回该变量的类型(包括顶层const和引用在内):

const int ci = 10, &cj = ci;

decltype(ci) x = 0; // x的类型是const int

decltype(cj) y = x; // y的类型是const int&,y绑定到变量x

decltype(cj) z; // 错误:z是一个引用,必须初始化

需要指出:引用从来都是作为其所指的对象的同义词出现,只有在decltype处是一个例外。

decltype和指针:

int i = 42, *p = &i;

decltype(*p) c;       // 错误:c是int&,必须初始化

如果表达式的内容是解引用操作,则decltype将得到引用类型。正如我们所熟悉的那样,解引用指针可以得到指针所指的对象,而且还能给这个对象赋值。因此,decltype(*p)的结果类型就是int&,而非int.

需要注意的点:

对于decltype所用的表达式来说,如果变量名加上了一对括号,则得到的类型于不加括号时会有不同。如果decltype使用的是一个不加括号的变量,则得到的结果就是该变量的类型;如果给变量加上了一层或者多层括号,编译器就会把它当作是一个表达式。变量是一种可以作为赋值语句左值的特殊表达式,所以这样的decltype就会得到引用类型。

decltype((i)) d;  // 错误:d是int&,必须初始化

decltype(i) e;  // 正确:e是一个(未初始化的)int

所以,只有当decltype(variable)的variable本身就是一个引用时才是引用。


本文是对《C++Primer》的知识点总结

C++ decltype类型提示符总结相关推荐

  1. C++关键字之类型提示符 decltype

    类型提示符的原理: 选择并返回操作数的数据结构,在此过程中,编译器分析表达式并得到它的类型,却不实际计算表达式的值. 使用方式: int num = 0; decltype(num++) sun = ...

  2. C++ decltype类型说明符(尾置返回类型使用)

    转自https://blog.csdn.net/yhl_leo/article/details/50865552 1 基本语法 decltype 类型说明符生成指定表达式的类型.在此过程中,编译器分析 ...

  3. C++ decltype类型说明符

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50865552 1 基本语法 declt ...

  4. C++11之后的decltype类型指示符

    C++11之后的decltype类型指示符 一.什么是decltype类型指示符 二.typeid运算符 三.使用decltype指示符 四.decltype和引用 五.decltype(auto) ...

  5. [C++]decltype类型指示符

    decltype类型指示符 decltype类型指示符:如果你希望从表达式的类型推断出要定义的变量的类型,但是却不想用表达式的值来初始化这个变量,那么你就可以使用decltype关键字,来说明这个变量 ...

  6. C++11 decltype类型推导详解

    decltype decltype 是 C++11 新增的一个关键字,它和 auto 的功能一样,都用来在编译时期进行自动类型推导. decltype 是"declare type" ...

  7. 二、C++11新特性:decltype类型推导

    目录 二.decltype类型推导 2.1. decltype decltype和auto的异同: 2.2.decltype的应用 ①.decltype和typedf/using合用 ②.deltyp ...

  8. C++ decltype类型推导完全攻略

    C++ decltype类型推导完全攻略 decltype 是 C++11 新增的一个关键字,它和 auto 的功能一样,都用来在编译时期进行自动类型推导. decltype 是"decla ...

  9. C++11之decltype类型推导(使用场景、推导四规则、cv限定符)

    系列文章 C++11之正则表达式(regex_match.regex_search.regex_replace) C++11之线程库(Thread.Mutex.atomic.lock_guard.同步 ...

最新文章

  1. java list 两个集合比较 不存在则新增 存在修改_Java之集合
  2. create-react-app 脚手架构建项目,搬砖过程中持续总结心得
  3. leetcode C++ 4. 寻找两个有序数组的中位数 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log
  4. cp无法获取文件状态stat_Node.js从零开始——文件系统
  5. Twain 学习纪录
  6. struts2 零配置
  7. echarts 多次通过setOption改变图形数据时 数据有时不进行变化
  8. 《 Docker 技术入门与实战 》读书笔记 ( CentOS 安装 Docker )
  9. Linux 监控命令之 netstat
  10. 蓝桥杯单片机:11届决赛
  11. Python演示正多边形逼近圆周过程中计算圆周率近似值
  12. 移动端向上滑动整个屏幕
  13. 「leetcode」 1382. 将二叉搜索树变平衡:【构造平衡二叉搜索树】详解
  14. Axure 安装图标字体元件库
  15. java使用hdf.jar_在HDFView 2.14上查看使用h5py编写的大(12.5GB)HDF5文件
  16. android 系统打印服务,调用Android本地服务,实现打印pdf文件
  17. python安装文件或目录损坏_文件或目录损坏且无法读取的解决办法
  18. 生如夏花之绚烂,Lisp风格的Lialang诞生了!
  19. 仿购物网站-HTML手写代码(仅提供参考)
  20. CollectionView的HeaderView头视图悬停

热门文章

  1. 维修打包机公司介绍常见打包机故障与维修方法
  2. 中国人民银行招聘计算机水平,2019中国人民银行招聘计算机模拟试题及答案
  3. 设备防病毒-深信达MCK(云私钥)
  4. 2021计算机专业考研科目,2021年考研计算机考试科目
  5. 人工智能法甲分析报告:揭秘巴黎独霸原因
  6. 静态网站(博客)生成器Static Site Generators(SSGs)大集合
  7. 【Java】 # 使用java调用MySQL的函数、存储过程
  8. java 混淆 ant_Ant编译android,并Proguard代码混淆,v4混淆配置
  9. 正则表达式实例:取得普陀区所有的小区名字和地址
  10. Arduino 好盈电调基本控制(PWM)