decltype关键字

获取表达式的类型

        auto用于通过一个表达式在编译时确定待定义的变量类型,auto所修饰的变量必须被初始化,编译器需要通过初始化来确定auto所代表的类型,即必须要定义变量。若仅希望得到类型,而不需要(或不能)定义变量的时候就要使用C++11新增的decltype关键字了,用于在编译时推导出一个表达式的类型。它的语法格式如下:

        decltype (exp)

        其中,exp表示一个表达式。

        从格式上来看,decltype很像sizeof---用来推导表达式类型大小的操作。类似于sizeof,decltype的推导过程是在编译期完成的,并且不会真正计算表达式的值。

        int x = 0;      

        decltype (x) y = 1;                // y -> int

        decltype (x + y) z = 0;          // z -> int

        const 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 **

        y和z的结果表明decltype可以根据表达式直接推导出它的类型本身。

        j的结果表明decltype通过表达式得到的类型,可以保留住表达式的引用以及const限定符。实际上,对于一般的标记符表达式,decltype将精确的推导出表达式定义本身的类型,不会像auto那样在某些情况下舍弃引用和cv限定符。

        p,pi的结果表明decltype可以像auto一样,加上引用和指针,以及cv限定符。

        pp的推导则表明,当表达式是一个指针的时候,decltype仍然推导出表达式的实际类型(指针类型),之后结合pp定义的指针标记,得到的pp是一个二维指针类型。

decltype的推导规则

        介绍decltype(exp)的推导规则:

        推导规则1:exp是标识符,类访问表达式,decltype(exp)和exp的类型一致。

        推导规则2:exp是函数调用,decltype(exp)和返回值的类型一致。

        推导规则3:其他情况,若exp是一个左值,则decltype(exp)是exp类型的左值引用,否则和exp类型一致。

        为了更好的讲解这些规则的使用场景,下面根据上面的规范分3种情况一次讨论:

        1、标识符表达式和类访问表达式。

        2、函数调用(非标识符表达式,也非类访问表达式)。

        3、带括号的表达式和加法运算表达是否(其他情况)。

标识符表达式和类访问表达式示例:

        class Foo

        {

                public static const int Number = 0;

                int x;

        };

        int n = 0;

        volatile const int& x = 0;

        decltype(n) a = n;                //a -> int

        decltype(x) b = n;                //b -> volatile const int &

        decltype(Foo::Number) c = 0;        // c -> const int 

        Foo foo;

        decltype(foo.x) d = 0;            // d -> int,类访问表达式

        变量a,b,c保留了表达式的所有属性(cv,引用)。这里的结果是很简单的,按照推导规则1,对于标识符表达式而言,decltype的推导结果就和这个变量的类型定义一致。

        d是一个类访问表达式,也符合推导规则1。

函数调用示例:

        int & func_int_r();        //左值(可简单理解为可寻址值)

        int func_int();               //纯右值

        const int& func_cint_r();        //左值

        const int func_cint();        //纯右值

        const Foo func_cfoo();        //纯右值

        int x = 0;

        decltype (func_int_r()) a1 = x;        //a1 -> int &

        decltype(func_int()) c1 = 0;             // c1 -> int 

        decltype (func_cint_r()) a1 = x;        //a1 -> const int &

        decltype(func_cint()) c1 = 0;             // c1 -> int 

        decltype(func_cfoo()) ff = Foo;        //ff -> const Foo

        可以看到,按照推导规则2,decltype的结果和函数的返回值类型保持一致。

   

带括号的表达式和加法运算表达式示例:

        struct Foo {int x;};     

        const Foo foo = Foo();

        decltype(foo.x) a = 0;                // a -> int

        decltype((foo.x));                       // b -> const int &

        int n = 0, m = 0;

        decltype(n + m) c = 0;                // c -> int

        decltype(n += m) d = c;                // d -> int&

        a和b的结果:仅仅多了一对括号,它们得到的类型却是不同的。

        a的结果很直接的,根据推导规则1,a的类型就是foo.x的定义类型。

        b的结果并不适用于推导规则1和2.根据foo.x是一个左值,可知括号表达式也是一个左值。因此可以按照推导规则3,知道decltype的结果将是一个左值引用。

        foo的定义是const Foo,所以foo.x是一个const int类型左值,因此decltype的推导结果是const int&.

        同样,n+m返回一个右值,按照推导规则3,decltype的结果为int。

        最后,n + m返回一个左值,按照推导规则3,decltype的结果为int &。

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/110452.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器人制作开源方案 | 行星探测车概述

1. 功能描述 行星探测车(Planetary Rover)是一种用于进行科学探索和勘测任务的无人车辆,它们被设计成能够适应各种复杂的地形条件和极端环境,以便收集数据、拍摄照片、采集样本等。行星探测车通常包含以下主要组件和功能&#xff…

抖音小程序制作源码系统 带完整搭建教程

在当今社交媒体时代,抖音作为一款备受欢迎的短视频应用,已经拥有了庞大的用户群体。与此同时,抖音小程序也成为了商家和开发者们关注的热点。今天小编就来给大家介绍一款抖音小程序制作源码系统,五分钟确实创建一个小程序。 系统特…

音乐播放器VHDL蜂鸣器数码管显示简谱,视频/代码

名称:音乐播放器数码管显示简谱蜂鸣器 软件:Quartus 语言:VHDL 代码功能: 设计音乐播放器,播放一首歌,使用开发板的蜂鸣器播放音乐,使用Quartus内的ROM IP核存储音乐文件,使用数…

为什么要做数据可视化

在当今信息爆炸的时代,数据已成为个人和企业最宝贵的资产之一。然而,仅仅拥有大量的数据并不足以支持明智的决策。数据可视化,作为一种将数据转化为图形形式的技术和方法,可以帮助我们更好地理解和分析数据,从而更准确…

《golang设计模式》第三部分·行为型模式-01-责任链模式(Chain of Responsibility)

文章目录 1 概念1.1 角色1.2 类图 2. 代码示例2.1 设计2.2 代码2.3 类图 1 概念 责任链(Chain of Responsibility)是指将客户端请求处理的不同职责对象组成请求处理链。 客户端只需要将请求交付到该链上,而不需要关心链上含有哪些对象。请求…

首次建站用香港服务器有影响没?

​  对于首次租用香港服务器的朋友来说,难免会对它没有一个很清晰的认知。因此,本文就从香港服务器适用人群,以及建站影响,选择技巧上做一个全方位的解答。 1. 哪一类人群适合使用香港服务器建站? 做外贸业务的网站。香港走的国…

时间序列预测 Graph-WaveNet:Graph WaveNet for Deep Spatial-Temporal Graph Modeling

Graph-WaveNet Graph WaveNet for Deep Spatial-Temporal Graph Modeling1.概述2.提出问题 & 解决策略 & 模型结构3.实验结果 ** Graph WaveNet for Deep Spatial-Temporal Graph Modeling ** 1.概述 时空图建模是分析系统中各组成部分的空间关系和时间趋势的一项重…

上海市教委产学研教师沙龙成功举办,共研大模型AI人才培养与插件生态

10月15日,百度飞桨携手上海市教育委员会、上海市学位委员会、上海物联网行业协会联合举办的“AI大模型产学研融合创新”上海研究生导师沙龙,在百度飞桨(张江)人工智能产业赋能中心顺利召开。来自上海地区20位高校及科研机构在聘研…

正向代理与反向代理

正向代理 客户端想要直接与目标服务器连接,但是无法直接进行连接,就需要先去访问中间的代理服务器,让代理服务器代替客户端去访问目标服务器 反向代理 屏蔽掉服务器的信息,经常用在多台服务器的分布式部署上,像一些大型…

C#快速排序算法

快速排序实现原理 快速排序(Quick Sort)是一种常用的排序算法,它基于分治的思想,通过将一个无序的序列分割成两个子序列,并递归地对子序列进行排序,最终完成整个序列的排序。 其基本思路如下: 选…

屏幕录制视频编辑软件 Camtasia 2023 mac中文版软件功能

Camtasia 2023 mac是一款功能强大的屏幕录制和视频编辑软件,可以用于制作教育课程、演示文稿、培训视频等。它具有一系列工具和功能,包括屏幕录制、视频编辑、音频编辑、字幕、特效等,使用户可以轻松地创建高质量的视频内容。 Camtasia2023的…

MongoDB索引操作

1、创建索引 语句: db.collection.createIndex(keys, options, commitQuorum) 选项参数名类型描述keys 包含排序字段和排序方式的对象, 值: 1为升序索引 -1为降序索引 options参数控制对象backgroundboolean 可选&#xff0…

计算机基础知识34

进程锁 # 锁在IT界很重要,不但在Python中出现,尤其是数据库中得锁更多,比如:表锁、行锁、 悲观锁、乐观锁、进程锁、互斥锁、递归锁、可重入锁、死锁等 # 保证安全 import time # 导入time,执行顺序乱了 from…

面试题-React(十五):React中的CSS编写方案及推荐

在React开发中,如何组织和编写CSS是一个常见的问题,React官方并没有一种固定的CSS编写方式,所以在目前的React开发中可能存在各种各样不同的编写CSS风格。本文将介绍React中几种常用的CSS编写方案,分析其优缺点,并推荐…

服务CPU异常飙高问题分析和解决

📢📢📢📣📣📣 哈喽!大家好,我是「奇点」,江湖人称 singularity。刚工作几年,想和大家一同进步🤝🤝 一位上进心十足的【Java ToB端大厂…

如何使用uview中的loadmore上拉加载

普通用法 HTML <view><view><!-- 内容 --></view><u-loadmore :status"status" /> </view> JS&#xff0c;onReachBottom这个是生命周期&#xff0c;和method同级 data() {return {goods:null,status: loadmore,//当前状态p…

1208. 翻硬币

题目&#xff1a; 1208. 翻硬币 - AcWing题库 思路&#xff1a; 1.对于要求从A变化到B的这类题&#xff0c;可以采用开关控制的方法。 2.一次翻转连续两个硬币&#xff0c;求origin变为result 最少需要翻转多少次。我们在origin的两个硬币中间放一个开关&#xff0c;开关变换…

除静电感测型离子风棒在无尘车间中的应用

除静电感测型离子风棒是一种能够检测静电并及时释放离子的离子风棒&#xff0c;在无尘车间中应用非常广泛。以下是除静电感测型离子风棒在无尘车间中的应用&#xff1a; 防止静电干扰&#xff1a;在无尘车间中&#xff0c;静电干扰会影响电子元器件和仪器设备的正常工作&#x…

基于STM32设计的智慧农业管理系统(ESP8266+腾讯云微信小程序)

一、项目介绍 基于STM32设计的智慧农业控制系统(ESP8266+腾讯云微信小程序) 1.1 项目背景 随着人们对食品安全和生态环境的日益重视,智慧农业逐渐成为一个备受关注的领域。智能化管理可以提高农业生产效率,减少资源浪费,改善生态环境。因此,基于物联网技术的智慧农业管理系…

数据结构-堆排序Java实现

目录 一、引言二、算法步骤三、原理演示步骤1: 构建最大堆步骤2: 交换和堆化步骤3: 排序完成 四、代码实战五、结论 一、引言 堆排序是一种利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构&#xff0c;并同时满足堆积的性质&#xff1a;即子结点的键值或…