• 关注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 凌风)

    好了。临时就想到这么多,先写到这吧

    本人新的博客地址  凌风技术站



  • 相关阅读:
    tp框架实现ajax
    tp框架的增删改查
    tp框架获取常量信息、方法、命名空间
    tp框架,访问方式、空方法
    tp基础,文件存储路径
    缓存
    CMS系统存储路径
    Smarty模版引擎的原理
    php的empty(),trim(),strlen()方法
    PHP 流程管理
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/6718498.html
Copyright © 2020-2023  润新知