一、auto和decltype

1.auto和decltype都是C++11新增的关键字,都用于类型自动推导。

类型格式

auto varname = value;  //auto的语法格式
decltype(exp) varname [= value];  //decltype的语法格式,中括号可不要

其中,varname 表示变量名,value 表示赋给变量的值,exp 表示一个表达式,方括号[ ]表示可有可无。
auto 和 decltype 都会自动推导出变量 varname 的类型:

  • auto 根据=右边的初始值 value 推导出变量的类型;
  • decltype 根据 exp 表达式推导出变量的类型,跟=右边的 value 没有关系。

另外,auto 要求变量必须初始化,也就是在定义变量的同时必须给它赋值;而 decltype 不要求,初始化与否都不影响变量的类型。这很容易理解,因为 auto 是根据变量的初始值来推导出变量类型的,如果不初始化,变量的类型也就无法推导了。

auto 将变量的类型和初始值绑定在一起,而 decltype 将变量的类型和初始值分开;虽然 auto 的书写更加简洁,但 decltype 的使用更加灵活

auto n1 = 10;
decltype(10) n2 = 99;auto url1 = "http://c.biancheng.net/cplus/";
decltype(url1) url2 = "http://c.biancheng.net/java/";auto f1 = 2.5;
decltype(n1*6.7) f2;

2.对cv限定符限定符的处理

cv 限定符是 const 和 volatile 关键字的统称:

  • const 关键字用来表示数据是只读的,也就是不能被修改;
  • volatile 和 const 是相反的,它用来表示数据是可变的、易变的,目的是不让 CPU 将数据缓存到寄存器,而是从原始的内存中读取。

在推导变量类型时,auto 和 decltype 对 cv 限制符的处理是不一样的。decltype 会保留 cv 限定符,而 auto 有可能会去掉 cv 限定符。

以下是 auto 关键字对 cv 限定符的推导规则:

  • 如果表达式的类型不是指针或者引用,auto 会把 cv 限定符直接抛弃,推导成 non-const 或者 non-volatile 类型。
  • 如果表达式的类型是指针或者引用,auto 将保留 cv 限定符。
//非指针非引用类型
const int n1 = 0;auto n2 = 10;
n2 = 99;  //赋值不报错decltype(n1) n3 = 20;
n3 = 5;  //赋值报错//指针类型
const int *p1 = &n1;auto p2 = p1;
*p2 = 66;  //赋值报错decltype(p1) p3 = p1;
*p3 = 19;  //赋值报错

在 C++ 中无法将一个变量的完整类型输出,我们通过对变量赋值来判断它是否被 const 修饰;如果被 const 修饰那么赋值失败,如果不被 const 修饰那么赋值成功。虽然这种方案不太直观,但也是能达到目的的。
n2 赋值成功,说明不带 const,也就是 const 被 auto 抛弃了,这验证了 auto 的第一条推导规则。p2 赋值失败,说明是带 const 的,也就是 const 没有被 auto 抛弃,这验证了 auto 的第二条推导规则。
n3 和 p3 都赋值失败,说明 decltype 不会去掉表达式的 const 属性。

C++11新特性——auto和decltype相关推荐

  1. C++11新特性的总结

    C++11新特性 auto关键字(C++11)基于范围的for循环(C++11). 指针空值nullptr(C++11) C++动态内存管理 序列式容器 array forward_list; 继承和 ...

  2. 【C++面试宝典】C++11新特性知识总结

    目录 C++11新特性 auto自动类型推导 decltype类型指示符 nullptr常量 lambda表达式(匿名函数) 智能指针 auto_ptr unique_ptr shared_ptr w ...

  3. C++ C++基础语法入门总结(二)引用-内联函数-C++11新特性

    C++基础语法入门总结 C++引用 再谈引用和指针 C++内联函数 附加C++11新特性 auto关键字 基于范围的for循环 指针空值nullptr C++引用 引用:就是某一变量(目标)的一个别名 ...

  4. 【C++】C++11 新特性(auto,decltype,nullptr,快速遍历,【Lambda表达式详解】)

    C++11 重要新特性 auto decltype nullptr 快速遍历与数组初始化 Lambda 表达式 Lambda 应用 外部变量捕获 mutable auto 可以从初始化表达式中推断出变 ...

  5. C++11新特性decltype

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105042574 C ...

  6. C++11新特性之decltype类型推导

    ​ 目录 一.decltype关键字 二.decltype的推导规则 1.表达式为单独变量 2.表达式为函数调用 3.表达式为左值,或者被()包围 三. decltype的应用 在前面一章,小编已经对 ...

  7. C++11新特性之二:decltype

    decltype与auto关键字一样,用于进行编译时类型推导. decltype实际上有点像auto的反函数,auto可以让你声明一个变量,而decltype则可以从一个变量或表达式中得到类型,例如: ...

  8. C++11新特性之auto关键字的使用

    一.auto关键字简介 auto这个关键字并不是一个全新的关键字,在旧标准中,它代表的是"具有自动存储期的局部变量":但是它在这方面并没有起到很大的作用,比如:auto int i ...

  9. 深入浅出之C++11新特性

    1. auto类型赋予新含义 1.1 auto类型定义 在之前的 C++ 版本中,auto 关键字用来指明变量的存储类型,它和 static 关键字是相对的.auto 表示变量是自动存储的,这也是编译 ...

最新文章

  1. The bean 'xxxx.FeignClientSpecification', defined in null, could not be registered. A bean with that
  2. gatb_core_components
  3. 网页制作使用CSS样式制作轮播教程,静态网页设计与开发 1.案例——CSS3制作图片轮播图 (4)使用纯CSS3代码实现简单的图片轮播——分步骤实现.docx...
  4. BZOJ3261 最大异或和 解题报告(可持久化Trie树)
  5. 看完这篇 HTTPS,和面试官扯皮就没问题了
  6. initWithFrame方法的理解(转)
  7. MoCoV3:何恺明团队新作!解决Transformer自监督训练不稳定问题!
  8. 将文件内含有的特殊字符还原
  9. 《玩转掌上生活——手机网上生活达人秘笈》一1.2 迎接掌上生活
  10. 三十六、【减小apk包的体积】
  11. python 把函数作为参数 ---高阶函数
  12. convert mysql_MySQL的CONVERT()
  13. 华为网络技术培训笔记之常用网络工具(一)
  14. js布尔类型+数字判断_C ++中的布尔数据类型
  15. MongoDB数据库和集合的基本操作
  16. Atitit 提升战力眼光和组织能力的几大要点 目录 1. 成长金字塔模型 德雷福斯模型 1 2. 提升战略眼光, 3 2.1. 视野与格局 3 2.2. 未来预测 未来发展负责,判断未来趋势, 3
  17. opencv 二值化处理
  18. Review Board了解
  19. 转 OpenGL核心技术之帧缓冲
  20. 彻底解决Vista狂读硬盘,硬盘灯狂闪的问题

热门文章

  1. 【Computer Organization笔记10】单周期CPU设计:基于7条MIPS指令的数据通路
  2. python na不显示 占位_Python学习之路—Python基础(一)
  3. linux shell 子进程结束,关于linux:如何终止以shell = True启动的python子进程
  4. 使CEdit处于全选状态
  5. 用RT Server Customizer定制Windows 2008 R2安装光盘
  6. 『数据可视化』基于Python的数据可视化工具
  7. 短时间让大家对C++ STL有所学习
  8. location.reload() 和 location.replace()的区别和应用
  9. 强化简书社交属性,淡化官腔官调
  10. 使用OGR2OGR将S57数据转为shp格式