关注C++细节——C++11新标准之decltype的使用注意
c++11新特性——decltype
decltype是C++11加入的一个新的keyword,目的是选择并返回操作数的数据类型,重要的是,在此过程中编译器分析表达式并得到它的类型,却不实际计算表达式的值。
对于内置类型的对象。使用decltype非常直观,但当參数为复合类型的时候就应该注意一些使用细节问题。
1.当decltype作用于数组的时候就应该小心了,本文作者(CSDN iaccepted)。
intiarr[10] = {0};
decltype(iarr)ib;
这个时候ib的定义等价于 int ib[10];两者是一样的。不要觉得ib是一个指针了,它是一个正宗的数组。
我们能够验证一下:
cout<< sizeof(ib) << endl;
假设ib是10个元素数组的指针非常明显将输出4。可是假设ib表示数组类型则会输出4*10 = 40.这地方全然类似于原有的typedefkeyword。
typedefint iarr[10];
iarrib; //跟这里的decltype(iarr) ib是一样的功能。
2.就是由于上述的这个细节。在写函数返回值的时候就要注意类型问题。
decltype(iarr)function(){
//本文作者(CSDN iaccepted)
return***;
}
上述的语句就是错误的,由于非常明显decltype(iarr) 表示以数组作为返回值,这在c++中是不同意的。
intia[3];
intiaa[][3] = { { 0 }, { 1 }, { 2 }, { 3 }, { 4 } };
intiab[][3] = { { 1 }, { 2 }, { 3 }, { 4 }, { 5 } };
这时候我们写个函数通过參数决定是使用iaa数组还是iab数组,也就是返回值要返回哪个数组首地址,要返回二维数组的首地址当然有多种写法,这里主要说一下使用decltype的注意点。
decltype(ia)*function(int index){
if (index == 1)returniaa;
elsereturn iab;
}//本文作者(CSDN iaccepted 凌风)
这样就能实现,decltype(ia)返回一个数组类型,该类型为指向一个有三个整形元素的数组,所以decltype(ia) * 就能表示一个指向数组元素的指针,即该指针指向一个数组,数组内的每一个元素又是包括三个整数的数组元素。
以上面的样例来说,函数的返回值若记为p,则p指向iaa[0]而p+1则指向iaa[1],*p 为iaa[0][0]的地址 *p + 1 为iaa[0][1]的地址,这里就说多了,由于这就是普通指针的特性,ok。
3.当decltype參数为指针的解引用的话就要注意了,此时返回引用类型而不是解引用后的类型。
intia[3] = { 1, 2, 3 };//本文作者(CSDN iaccepted 凌风)
decltype(*ia)b; //这就会出错,由于此时b是一个指向整形变量的引用,而引用必须在定义的时候初始化。
这里为什么返回引用事实上非常好理解。由于*ia就是当前指针所指对象的一个引用。由于我们能够直接给*ia赋值来改变ia所指对象的值,比方
*ia= 5;
此时ia[0] 就变成5. 同理
decltype(ia[1])b; //也是错误的,由于b为一个引用必须初始化。
//本文作者(CSDN iaccepted 凌风)
好了。临时就想到这么多,先写到这吧
本人新的博客地址 凌风技术站
关注C++细节——C++11新标准之decltype的使用注意的更多相关文章
- C++11新标准:decltype关键字
一.decltype意义 有时我们希望从表达式的类型推断出要定义的变量类型,但是不想用该表达式的值初始化变量(如果要初始化就用auto了).为了满足这一需求,C++11新标准引入了decltype类型 ...
- C++11新标准学习
<深入理解C++11:C++11新特性解析与应用> <华章科技:深入理解C++11:C++11新特性解析与应用>一共8章:第1章从设计思维和应用范畴两个维度对C++11新标准中 ...
- C++11新标准:nullptr关键字
一.nullptr的意义 1.NULL在C中的定义 #define NULL (void*)0 2.NULL在C++中的定义 #ifndef NULL #ifdef __cplusplus #defi ...
- C++11新标准:auto关键字
一.auto意义 编程时常常需要把表达式的值赋给变量,这就要求在声明变量的时候清楚地知道表达式的类型,然后要做到这一点并非那么容易.为了解决这个问题,C++11新标准引入了auto类型说明符,用它就能 ...
- c++11新标准for循环和lambda表达式
:first-child { margin-top: 0px; } .markdown-preview:not([data-use-github-style]) h1, .markdown-previ ...
- 基于c++11新标准开发一个支持多线程高并发的网络库
背景 新的c++11标准出后,c++语法得到了非常多的扩展,比起以往不论什么时候都要灵活和高效,提高了程序编码的效率,为软件开发者节省了不少的时间. 之前我也写过基于ACE的网络server框架,但A ...
- C++11新标准
1. 新类型 long long和unsigned long long: char16_t 和 char32_t: 新增原始字符串: 2. 统一的初始化 C++11扩大了用大括号括起的列表(初始化列表 ...
- C++ 11新标准实现POJ No.1002-487-3279
487-3279(重复的电话号码查询)(标签:优先队列,哈希表) 题目描述 企业喜欢用容易被记住的电话号码.让电话号码容易被记住的一个办法是将它写成一个容易记住的单词或者短语.例如,你需要给滑铁卢大学 ...
- C++ 11新标准实现POJ No.1001-Exponentiation
Exponentiation(高精度幂计算)(标签:链表,字符串,快速幂计算) 题目描述 对数值很大.精度很高的数进行高精度计算是一类十分常见的问题.比如,对国债进行计算就是属于这类问题. 现在要你解 ...
随机推荐
- PHP大转盘中奖概率算法实例
本文实例讲述了PHP大转盘中奖概率算法的实现方法,分享给大家供大家参考.具体如下: 大转盘是最近很多线上网动中一个比较有意思的东西了,下面我们就来看看这个大转盘中奖概率算法与例子,希望对各位有所帮助. ...
- object-c语言的nonatomic,assign,copy,retain的区别
nonatomic: 非原子性访问,不加同步,多线程并发访问会提高性能.如果不加此属性,则默认是两个访问方法都为原子型事务访问. (atomic是Objc使用的一 ...
- 解决WPF中重载Window.OnRender函数失效问题
今天实验一个绘图算法的时候,偶然发现重载Window.OnRender的方法是没有效果的. public partial class MainWindow : Window { public Main ...
- HDU 4496 D-City (并查集,水题)
D-City Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Subm ...
- ARM 调用约定 calling convention
int bar( int a, int b, int c, int d, int e, int f, int g ) { ]; array2[ ] = a + b; array2[ ] = b + c ...
- source insight完全卸载
由于不知名原因 source insight崩溃了,使用自带的卸载,完成之后重新安装软件注册还是出问题.在网上搜索资料发现就是删除注册表中的内容. 由于列出的删除项目不完全,导致还是出问题. 最后删除 ...
- JMeter技巧集锦
收藏些介绍JMeter使用知识的文章 1.JMeter技巧集锦 http://www.javaworld.com/javaworld/jw-07-2005/jw-0711-jmeter.html (网 ...
- Ruby:对象模型(又称八卦模型)笔记
备注 如果说哪门语言对我影响最大,那就是Ruby了,在.NET阵营多年,试图去用C#的思维去解释很多东西,当然解释Java是足够了,可惜我也用了好几年去解释Javascript,结果是可想而知的:解释 ...
- Python学习(四)数据结构 —— bool
Python 布尔类型 bool python 中布尔值使用常量True 和 False来表示:注意大小写 比较运算符< > == 等返回的类型就是bool类型:布尔类型通常在 if 和 ...
- WEB漏洞挖掘技术总结
漏洞挖掘技术一直是网络攻击者最感兴趣的问题,漏洞挖掘的范围也在随着技术的提升而有所变化.在前期针对缓冲区溢出.格式化字符串.堆溢出.lib库溢出等技术都是针对ELF文件(Linux可执行文件)或者PE ...