C++(decltype用法举例说明)

decltype是C++11添加的一个新的关键字,目的是选择并返回操作数的数据类型,重要的是,在此过程中编译器分析表达式并得到它的类型,却不实际计算表达式的值,今天通过本文给大家介绍C++ decltype用法,通过实例代码给大家介绍的非常

C++,decltype用法举例说明,恰卡网带你了解更多相关信息。

1.什么是decltype

decltype是C++11新增的一个关键字,和auto的功能一样,用来在编译时期进行自动类型推导。引入decltype是因为auto并不适用于所有的自动类型推导场景,在某些特殊情况下auto用起来很不方便,甚至压根无法使用。

对于内置类型的对象,使用decltype很直观,但当参数为复合类型的时候就应该注意一些使用细节问题。

auto varName=value;decltype(exp) varName=value;

  • auto根据=右边的初始值推导出变量的类型,decltype根据exp表达式推导出变量的类型,跟=右边的value没有关系
  • auto要求变量必须初始化,这是因为auto根据变量的初始值来推导变量类型的,如果不初始化,变量的类型也就无法推导
  • 而decltype不要求,因此可以写成如下形式

decltype(exp) varName;

原则上将,exp只是一个普通的表达式,它可以是任意复杂的形式,但必须保证exp的结果是有类型的,不能是void;如exp为一个返回值为void的函数时,exp的结果也是void类型,此时会导致编译错误

1.1decltype的几种形式

int x = 0;decltype(x) y = 1;           // y -> intdecltype(x + y) z = 0;       // z -> intconst int& i = x;decltype(i) j = y;           // j -> const int &const decltype(z) * p = &z;  // *p  -> const int, p  -> const int *decltype(z) * pi = &z;       // *pi -> int      , pi -> int *decltype(pi)* pp = π      // *pp -> int *    , pp -> int * *

2.推导规则

decltype的推导规则可以简单概述如下:

  • 如果exp是一个不被括号()包围的表达式,或者是一个类成员访问表达式,或者是一个单独的变量,decltype(exp)的类型和exp一致
  • 如果exp是函数调用,则decltype(exp)的类型就和函数返回值的类型一致
  • 如果exp是一个左值,或被括号()包围,decltype(exp)的类型就是exp的引用,假设exp的类型为T,则decltype(exp)的类型为T&

规则1示例:

#include<string> #include<iostream>using namespace std; class A{public:    static int total;    string name;    int age;    float scores;} int A::total=0; int main(){int n=0;const int &r=n;A a;decltype(n) x=n;    //n为Int,x被推导为Intdecltype(r) y=n;    //r为const int &,y被推导为const int &decltype(A::total)  z=0;  ///total是类A的一个int 类型的成员变量,z被推导为intdecltype(A.name) url=\"www.baidu.com\";//url为stringleixreturn 0;}

规则2示例:

int& func1(int ,char);//返回值为int&int&& func2(void);//返回值为int&&int func3(double);//返回值为int const int& func4(int,int,int);//返回值为const int&const int&& func5(void);//返回值为const int&& int n=50;decltype(func1(100,\'A\')) a=n;//a的类型为int&decltype(func2()) b=0;//b的类型为int&&decltype(func3(10.5)) c=0;//c的类型为int decltype(func4(1,2,3)) x=n;//x的类型为const int&decltype(func5()) y=0;//y的类型为const int&&

exp中调用函数时需要带上括号和参数,但这仅仅是形式,并不会真的去执行函数代码

规则3示例:

class A{public:   int x;} int main(){const A obj;decltype(obj.x) a=0;//a的类型为intdecltype((obj.x)) b=a;//b的类型为int& int n=0,m=0;decltype(m+n) c=0;//n+m得到一个右值,c的类型为intdecltype(n=n+m) d=c;//n=n+m得到一个左值,d的类型为int &return 0;}

左值:表达式执行结束后依然存在的数据,即持久性数据;右值是指那些在表达式执行结束不再存在的数据,即临时性数据。一个区分的简单方法是:对表达式取地址,如果编译器不报错就是左值,否则为右值

3.实际应用

类的静态成员可以使用auto, 对于类的非静态成员无法使用auto,如果想推导类的非静态成员的类型,只能使用decltype。

示例如下:

template<typename T>class A{private :   decltype(T.begin()) m_it;   //typename T::iterator m_it;   //这种用法会出错public:void func(T& container){   m_it=container.begin();}}; int main(){ const vector<int> v;A<const vector<int>> obj;obj.func(v);return 0;}

到此这篇关于C++ decltype用法举例说明的文章就介绍到这了,更多相关C++ decltype内容请搜索趣讯吧以前的文章或继续浏览下面的相关文章希望大家以后多多支持趣讯吧!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 55@qq.com 举报,一经查实,本站将立刻删除。转转请注明出处:https://www.szhjjp.com/n/2107.html

(0)
nan
上一篇 2021-07-10
下一篇 2021-07-10

相关推荐

  • 温晓沐傅少衍全文免费在线分享-小说温晓沐傅少衍无弹窗免费阅读

    “真的,我发誓……” “那好,”季明蕊收了剪刀,“我给你出个主意,让你不用嫁给沈念深哥,怎么样?” 温晓沐见她把剪刀拿走了,心里稍稍松了一口气,将信将疑的望着她, “你有办法?” “偷梁换柱。” 季明蕊凑近她耳边,压低了声音讲了一番话,走的时候将剪刀丢在她身边的地板上,发出‘哐’的一道巨响,震的温晓沐浑身一颤, “你为什么要帮我?” 季明蕊冷笑了一声, “我不是帮你,我是帮我自己,你不想嫁我想,还

    网络资讯 2023-04-30
    0
  • 容晚秦愠长篇小说叫什么-容晚秦愠免费观看

    两个宫人虽然背着人的时候什么都敢说,可对上容晚到底还是胆怯,犹豫片刻抬手“啪啪啪”的扇起了自己的巴掌。她们年纪不大,脸皮薄嫩,不多时两颊就肿了,容晚这才淡淡的喊了停,宫女们低着头话都不敢说。“下次再让我听见你们嚼舌根,舌头就不用留着了。”“是。”

    网络资讯 2023-06-04
    0
  • 讨鬼传psp攻略(PSP游戏讨鬼传好玩吗)

    序章·以共斗之名“真猎人,玩讨鬼!”回想当年索尼痛失《怪物猎人》系列后在“共斗游戏”方面曾经苦下功夫:《讨鬼传》系列、《灵魂献祭》系列、《噬神者》系列以及离大作只差半步的《自由战争》,游戏虽多却没能做

    2022-01-16
    0
  • 他怀里的玫瑰完整章节阅读(第22-25章)傅诀安歌全文试读

    圈子里都知晓,我被傅诀抛弃了。那天之后,傅诀就走了,一声不吭。我又独自搬回了小公寓。卡上被陈特助打了一大笔钱。天价分手费,也是不亏,我自嘲地想。顾焰商杀人的证据被找齐了,已经被抓进去了。我心里松了一口气,所以听到那些笑话我的话也当没听见。许颜和几个好友怕我心情不好,约我去新开的网红餐厅吃饭。就听见隔壁桌的人在讨论我和傅诀。

    网络资讯 2023-06-28
    0
  • 精彩小说方木兮裴渊帧-最新全文方木兮裴渊帧小说在线阅读

    方木兮点点头,“你的腿好些了吗?”“亏了你的药,早就好利索了。”春秀咧着嘴笑,把一旁的骨头包好递给方木兮,“拿回去给孩子炖汤喝。”方木兮刚要拒绝,身后猛地被人用力撞击,若非她眼疾手快扶住了,估计是要趴地上了。春秀操着杀猪刀冲出来,扯着嗓门怒喝,“哪个不长眼的,横冲直撞赶着投胎啊?”可不,真的是赶着投胎!撞人的是一辆木板车,车夫坐在前头,惊慌失措的下来,“对不起对不起!”哪知这一撞,竟从车上滑露出一条青紫色的胳膊。方木兮目光陡沉,快速掀开板车上的席子,只见车上排排躺着三人,皆是生面孔,肯定不是本村人,但他们

    网络资讯 2023-06-01
    0
  • 喝青汁为什么反而胖了 喝青汁减肥管用吗

    青汁,其含有一定的纤维素,具有一定的饱腹感,所以在饭前食用可以减少过后热量的摄取,有利于减肥,同时大麦若叶青汁中含有丰富的水分,饭前食用可以增大胃内容物,有利于减少食欲,因此很多人喜欢喝青汁减肥,那喝青汁为什么反而胖了呢?快来让我们一起了解看看吧!喝青汁为什么反而胖了?喝青汁是能起到一定的减肥作用,因为青汁热量极低,并且饱腹感比较强,饮用后能减少其他高热量食物摄入起到减肥的效果。但是在喝青汁期间一

    知识 2023-08-17
    0

发表回复

登录后才能评论