关注C++细节---C++11新标准之decltype的使用注意
来源:互联网 发布:cf淘宝刷经验会封号吗 编辑:程序博客网 时间:2024/06/14 09:50
转载自:
CSDN iaccepted 凌风,博客地址:http://blog.csdn.net/iaccepted
decltype是C++11添加的一个新的关键字,目的是选择并返回操作数的数据类型,重要的是,在此过程中编译器分析表达式并得到它的类型,却不实际计算表达式的值。
对于内置类型的对象,使用decltype很直观,但当参数为复合类型的时候就应该注意一些使用细节问题。
1.当decltype作用于数组的时候就应该小心了,本文作者(CSDN iaccepted)。
- intiarr[10] = {0};
- decltype(iarr)ib;
intiarr[10] = {0};decltype(iarr)ib;
这个时候ib的定义等价于 int ib[10];两者是一样的,不要认为ib是一个指针了,它是一个正宗的数组。我们可以验证一下:
- cout<< sizeof(ib) << endl;
cout<< sizeof(ib) << endl;
如果ib是10个元素数组的指针很明显将输出4,但是如果ib表示数组类型则会输出4*10 = 40.这地方完全类似于原有的typedef关键字。
- typedefint iarr[10];
- iarrib; //跟这里的decltype(iarr) ib是一样的功能。
typedefint iarr[10];iarrib; //跟这里的decltype(iarr) ib是一样的功能。
2.就是因为上述的这个细节,在写函数返回值的时候就要注意类型问题。
- decltype(iarr)function(){
- //本文作者(CSDN iaccepted)
- return***;
- }
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 } };
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)*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 凌风)
intia[3] = { 1, 2, 3 };//本文作者(CSDN iaccepted 凌风)
decltype(*ia)b; //这就会出错,因为此时b是一个指向整形变量的引用,而引用必须在定义的时候初始化。
这里为什么返回引用其实很好理解,因为*ia就是当前指针所指对象的一个引用,因为我们可以直接给*ia赋值来改变ia所指对象的值,比如
- *ia= 5;
*ia= 5;
此时ia[0] 就变成5. 同理
- decltype(ia[1])b; //也是错误的,因为b为一个引用必须初始化。
- //本文作者(CSDN iaccepted 凌风)
decltype(ia[1])b; //也是错误的,因为b为一个引用必须初始化。//本文作者(CSDN iaccepted 凌风)
好了,暂时就想到这么多,先写到这吧
本文作者:CSDN iaccepted 凌风,博客地址:http://blog.csdn.net/iaccepted
- 关注C++细节——C++11新标准之decltype的使用注意
- 关注C++细节---C++11新标准之decltype的使用注意
- c++11新标准 decltype
- [c++]c++11 新标准
- C需要注意的细节
- c语言注意的小细节
- Objective-C:一些要注意的细节
- Object-C中需要注意的细节
- c语言中注意细节
- c 语言新标准
- C语言新标准C11
- C语言新标准C11
- C语言11中的auto和decltype
- C语言 指针要注意的一些细节问题
- C语言要注意的一些小细节
- C#----GDI+画图的一些注意和细节
- Java调用C#WEBSERVICE需要注意的细节及实例
- 那些你可能不会注意的C+细节
- Spring的InitializingBean和init-method
- Java Socket编程如何建立两者关系
- sqlite简单使用
- 花呗套现之前一定要看一看,绝非广告
- ACM-测试数据 && 对拍
- 关注C++细节---C++11新标准之decltype的使用注意
- 代理模式以及多线程的简单使用
- 请定义一个宏,比较两个数的a、b的大小,不能使用大于、小于、if语句
- 树状数组
- 工厂模式
- 用GDB调试程序(一)
- mybaits批量insert和update
- 埃氏筛法 求素数
- 花呗套现骗局