C++11新特性——auto和decltype
一、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相关推荐
- C++11新特性的总结
C++11新特性 auto关键字(C++11)基于范围的for循环(C++11). 指针空值nullptr(C++11) C++动态内存管理 序列式容器 array forward_list; 继承和 ...
- 【C++面试宝典】C++11新特性知识总结
目录 C++11新特性 auto自动类型推导 decltype类型指示符 nullptr常量 lambda表达式(匿名函数) 智能指针 auto_ptr unique_ptr shared_ptr w ...
- C++ C++基础语法入门总结(二)引用-内联函数-C++11新特性
C++基础语法入门总结 C++引用 再谈引用和指针 C++内联函数 附加C++11新特性 auto关键字 基于范围的for循环 指针空值nullptr C++引用 引用:就是某一变量(目标)的一个别名 ...
- 【C++】C++11 新特性(auto,decltype,nullptr,快速遍历,【Lambda表达式详解】)
C++11 重要新特性 auto decltype nullptr 快速遍历与数组初始化 Lambda 表达式 Lambda 应用 外部变量捕获 mutable auto 可以从初始化表达式中推断出变 ...
- C++11新特性decltype
该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105042574 C ...
- C++11新特性之decltype类型推导
目录 一.decltype关键字 二.decltype的推导规则 1.表达式为单独变量 2.表达式为函数调用 3.表达式为左值,或者被()包围 三. decltype的应用 在前面一章,小编已经对 ...
- C++11新特性之二:decltype
decltype与auto关键字一样,用于进行编译时类型推导. decltype实际上有点像auto的反函数,auto可以让你声明一个变量,而decltype则可以从一个变量或表达式中得到类型,例如: ...
- C++11新特性之auto关键字的使用
一.auto关键字简介 auto这个关键字并不是一个全新的关键字,在旧标准中,它代表的是"具有自动存储期的局部变量":但是它在这方面并没有起到很大的作用,比如:auto int i ...
- 深入浅出之C++11新特性
1. auto类型赋予新含义 1.1 auto类型定义 在之前的 C++ 版本中,auto 关键字用来指明变量的存储类型,它和 static 关键字是相对的.auto 表示变量是自动存储的,这也是编译 ...
最新文章
- The bean 'xxxx.FeignClientSpecification', defined in null, could not be registered. A bean with that
- gatb_core_components
- 网页制作使用CSS样式制作轮播教程,静态网页设计与开发 1.案例——CSS3制作图片轮播图 (4)使用纯CSS3代码实现简单的图片轮播——分步骤实现.docx...
- BZOJ3261 最大异或和 解题报告(可持久化Trie树)
- 看完这篇 HTTPS,和面试官扯皮就没问题了
- initWithFrame方法的理解(转)
- MoCoV3:何恺明团队新作!解决Transformer自监督训练不稳定问题!
- 将文件内含有的特殊字符还原
- 《玩转掌上生活——手机网上生活达人秘笈》一1.2 迎接掌上生活
- 三十六、【减小apk包的体积】
- python 把函数作为参数 ---高阶函数
- convert mysql_MySQL的CONVERT()
- 华为网络技术培训笔记之常用网络工具(一)
- js布尔类型+数字判断_C ++中的布尔数据类型
- MongoDB数据库和集合的基本操作
- Atitit 提升战力眼光和组织能力的几大要点 目录 1. 成长金字塔模型 德雷福斯模型	1 2. 提升战略眼光,	3 2.1. 视野与格局	3 2.2. 未来预测 未来发展负责,判断未来趋势,	3
- opencv 二值化处理
- Review Board了解
- 转 OpenGL核心技术之帧缓冲
- 彻底解决Vista狂读硬盘,硬盘灯狂闪的问题
热门文章
- 【Computer Organization笔记10】单周期CPU设计:基于7条MIPS指令的数据通路
- python na不显示 占位_Python学习之路—Python基础(一)
- linux shell 子进程结束,关于linux:如何终止以shell = True启动的python子进程
- 使CEdit处于全选状态
- 用RT Server Customizer定制Windows 2008 R2安装光盘
- 『数据可视化』基于Python的数据可视化工具
- 短时间让大家对C++ STL有所学习
- location.reload() 和 location.replace()的区别和应用
- 强化简书社交属性,淡化官腔官调
- 使用OGR2OGR将S57数据转为shp格式