【C++11】auto与decltype关键字使用详解

系列文章目录

C++11新特性使用详解-持续更新


文章目录

    • 系列文章目录
    • 前言
    • 一、auto关键字
      • 1.根据变量的初始化表达式来推导变量的类型
      • 2.const与引用
    • 二、decltype关键字
      • 1.推断表达式的类型
      • 2.const与引用
    • 三、总结


前言

auto和decltype是C++11引入的俩个重要的新关键字,用于在编译期自动推导出变量或表达式的类型。极大提高代码的可读性和简洁性,并且有助于减少类型转换错误。


一、auto关键字

编程时常常需要把表达式的值赋给变量,这就要求变量申明时必须清楚知道表达式的类型。做到这点不容易或者根本做不到。为了解决这个问题,C++11引入auto关键字让编译器自动推导变量的类型。

1.根据变量的初始化表达式来推导变量的类型

auto a = 1; // a的类型为int  
auto b = 5.20; // b的类型为double  
auto c = "auto"; // c的类型为const char[6]  
auto person1 = Person(); // person1的类型为Person,并且自动初始化成员变量变量
auto person2 = Person{ "Fei", 30 }; // person2的类型为Person,并且根据指定的初始值初始化成员变量变量std::vector<int> vec = { 1, 2, 3, 4, 5 };
for (auto it = vec.begin(); it != vec.end(); ++it) {   // 在for循环中使用auto推导类型std::cout << *it << " ";
}

2.const与引用

使用引用其实是使用引用的对象。特别是当引用被当作初始值时,正在参与初始化的是引用对象的值。此时编译器以引用对象的类型作为auto的类型。

int i = 10, &r = i;
auto aa = r;  //推导出aa类型是int:r是i的别名,i是int(正在参与初始化的是引用对象的值,以引用对象的值作为auto的类型)//auto一般会忽略顶层const,同时底层const则会被保留
const int ci = i, &cr = ci;
auto bb = ci;  //推导出bb类型是int(ci的顶层const特性被忽略了)
auto cc = cr;  //推导出cc类型是int(cr是ci的别名,ci本身是一个顶层const)
auto dd = &i;  //推导出cc类型是int*
auto ee = &ci;  //推导出cc类型是const int*(对常量对象取地址是一种底层const)//如果希望auto推断出来的类型是一个顶层的const,需要明确指出
const auto ff = ci;  //推导出b类型是int//设置类型为auto的引用是,初始值中的顶层常量属性任然保留
auto &gg = ci;  //推导出b类型是const int&

二、decltype关键字

希望从表达式的类型中推导除要定义的变量的类型,但是不想用该表达式的值初始化变量。为了满足这各要求,C++11引入decltype关键字让编译器自动推导表达式的类型,而不用计算表达式的值。

1.推断表达式的类型

int x = 10;
decltype(x) y;    //y的类型是intdouble foo();
decltype(foo()) z;  //z的类型是double,根据函数返回值类型推导

2.const与引用

decltype处理顶层const和引用的方法和auto不同。
如果表达式是一个引用类型,decltype会去除引用,推导出引用所引用的类型。
例如,对于表达式int& x, decltype(x)的推导结果是int,去除了引用。

需要注意的是,decltype推导出的类型会保留顶层const限定符和volatile限定符,不会去除它们。

const int cii = 10, &cjj = cii;
decltype(cjj) xx = 0;   //x的类型是const int&
decltype(cjj) yy = xx;   //x的类型是const int&,y绑定到x
//decltype(cjj) zz;  //错误: z是个引用,必须初始化int xxx = 0;
decltype(xxx) pp = 0;

三、总结

在不影响代码可读性的前提下可以尽可能的使用auto。复杂类型用auto,但是简单内置类型就没有必要使用auto了。总之避免过度使用auto和decltype,以保持代码的可读性和维护性。

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

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

相关文章

简单几步,借助Aapose.Cells将 Excel XLS 转换为PPT

数据呈现是商业和学术工作的一个重要方面。通常&#xff0c;您需要将数据从一种格式转换为另一种格式&#xff0c;以创建信息丰富且具有视觉吸引力的演示文稿。当您需要在幻灯片上呈现工作表数据时&#xff0c;需要从 Excel XLS 转换为 PowerPoint 演示文稿。在这篇博文中&…

原理Redis-QuickList

QuickList **问题1&#xff1a;**ZipList虽然节省内存&#xff0c;但申请内存必须是连续空间&#xff0c;如果内存占用较多&#xff0c;申请内存效率很低。怎么办&#xff1f; 为了缓解这个问题&#xff0c;我们必须限制ZipList的长度和entry大小。 **问题2&#xff1a;**但是…

[网鼎杯 2018]Fakebook

[网鼎杯 2018]Fakebook 打开环境出现一个登录注册的页面 在登录和注册中发现 了地址栏出现变化&#xff0c;扫一波看看 看看robots.txt和flag.php 访问robots.txt看看 再访问user.php.bak <?php class UserInfo { public $name ""; public …

Head、Neck、Backbone介绍

在深度学习中&#xff0c;通常将模型分为三个部分&#xff1a;backbone、neck 和 head。 Backbone&#xff1a;backbone 是模型的主要组成部分&#xff0c;通常是一个卷积神经网络&#xff08;CNN&#xff09;或残差神经网络&#xff08;ResNet&#xff09;等。backbone 负责…

ON1 Photo RAW 2024 for Mac——专业照片编辑的终极利器

ON1 Photo RAW 2024 for Mac是一款专为Mac用户打造的照片编辑器&#xff0c;以其强大的功能和易用的操作&#xff0c;让你的照片编辑工作变得轻松愉快。 一、强大的RAW处理能力 ON1 Photo RAW 2024支持大量的RAW格式照片&#xff0c;能够让你在编辑过程中获得更多的自由度和更…

练习九-利用状态机实现比较复杂的接口设计

练习九-利用状态机实现比较复杂的接口设计 1&#xff0c;任务目的&#xff1a;2&#xff0c;RTL代码3&#xff0c;RTL原理框图4&#xff0c;测试代码5&#xff0c;波形输出 1&#xff0c;任务目的&#xff1a; &#xff08;1&#xff09;学习运用状态机控制的逻辑开关&#xff…

【C++11】=default与=delete关键字使用详解

系列文章目录 C11新特性使用详解-持续更新 文章目录 系列文章目录一、default关键字1. 为什么要引入default关键字2. 注意事项3. 使用default关键字有什么好处4.实例代码 二、delete关键字1. 为什么要引入delete关键字2. 注意事项3. 使用场景3.1删除默认构造函数3.2 删除拷贝构…

2023.11.22 -数据仓库的概念和发展

目录 https://blog.csdn.net/m0_49956154/article/details/134320307?spm1001.2014.3001.5501 1经典传统数仓架构 2离线大数据数仓架构 3数据仓库三层 数据运营层,源数据层&#xff08;ODS&#xff09;&#xff08;Operational Data Store&#xff09; 数据仓库层&#…

开发上门送桶装水小程序要考虑哪些业务场景

上门送水业务已经有很长一段时间了&#xff0c;但是最开始都是给用户发名片、贴小广告&#xff0c;然后客户电话订水&#xff0c;水站工作人员再上门去送&#xff0c;这种人工记单和派单效率并不高&#xff0c;并且电话沟通中也比较容易出现偏差&#xff0c;那么根据这个情况就…

IT 领域中的主要自动化趋势

48%的IT自动化流程属于IT服务管理&#xff0c;过去一年中&#xff0c;IT运维自动化增长了272%。 IT部门从交付者转变为战略伙伴 今年的《工作自动化指数》数据显示&#xff0c;自动化正在蔓延到组织的各个部门&#xff0c;越来越多的部门采用自动化&#xff0c;并且IT以外的员工…

一条命令彻底卸载Linux自带多个版本jdk

一条命令彻底卸载Linux自带多个版本jdk 检查系统已经安装的jdk rpm -qa | grep java卸载所有已经安装的 jdk xargs 将参数逐个传递 将已安装的 java 程序逐个当做参数传递给 rpm -e --nodeps rpm -qa | grep java | xargs rpm -e --nodeps再次检查系统已经安装的jdk rpm -qa | …

JS实现二分查找

最近在面试的时候被问到手写实现二分查找&#xff0c;虽然二分查找很早就听过&#xff0c;也知道实现原理&#xff0c;但是手撸起来&#xff0c;总是差点意思&#xff0c;正好复习一下。作为前端程序员&#xff0c;可能面试绝大部分公司不需要能写很复杂的算法问题&#xff0c;…

Azure Machine Learning - 搜索中的语义排名

目录 什么是语义排名&#xff1f;语义排名的工作原理如何收集和总结输入语义排名的输出如何对摘要进行评分 语义功能和限制 在 Azure AI 搜索中&#xff0c;“语义排名”通过使用语言理解对搜索结果重新排名来显著提高搜索相关性&#xff0c; 本文概括性地介绍了语义排名工作原…

Nodejs JavaScript 字符串加密

情景 问题的场景是这样的&#xff1a;我们需要在浏览器cookie中存储用户名&#xff0c;但又不想直接明文存储&#xff0c;所以对它进行了简单的加密存储。 因为是简单的加密&#xff0c;目的只是不希望明文存储。我们使用了Base64 编码&#xff0c;使得cookie里的存储不可只读…

Arthas 监听 Docker 部署的java项目CPU占比高的信息

1、Linux上安装Arthas wget https://alibaba.github.io/arthas/arthas-boot.jar2、docker ps 查看目标项目的容器ID 3、copy Arthas 到目标容器中 (注意有 &#x1f615; ) docker cp arthas-boot.jar d97e8666666:/4、进入到目标容器目录中 docker exec -it d97e8666666 /b…

5-7求三种数的和

#include<stdio.h> int main(){double sum10;double sum20;double sum30;double sum;int i;for(i1;i<100;i){sum1sum1i;}printf("sum1结果是&#xff1a;%15.6f\n",sum1);for(i1;i<50;i){sum2sum2i*i;}printf("sum2结果是&#xff1a;%15.6f\n"…

TS是什么、为什么、怎么办

TS是什么 javascript程序的静态类型检查器 为什么要用TS js编写时在预期不同类型值的地方使用了某种类型的值&#xff0c;导致常见的类型错误 js只能提供动态类型&#xff0c;也就是运行一下代码才能知道发生了什么&#xff0c;需要静态类型的检查 TS怎么用 1、安装vscode…

连接服务器的脚本

对于记不住的服务器密码且不愿用三方工具俺简单写了个脚本&#xff08;检测下最近shell脚本的学习效果咋样&#xff09; expect 是处理交互的一种脚本语言&#xff0c;spawn启动指定进程 -> expect获取指定关键字 -> send想指定进程发送指定指令 -> 执行完成后退出 sp…

Oracle:poor sql导致的latch: cache buffers chains案例

巡检时&#xff0c;执行如下sql发现长会话&#xff1a; SELECT SE.SID,SE.SERIAL#,TO_CHAR(LOGON_TIME,YYYY-MM-DD HH24:MI:SS),SE.STATUS,SE.OSUSER,SE.MACHINE,SE.PROGRAM,SE.BLOCKING_SESSION, SE.SQL_ID,SE.PREV_SQL_ID ,SE.EVENT,SE.P1TEXT,SE.P1,SE.P2TEXT,SE.P2,SE.P3…

LeetCode1161. Maximum Level Sum of a Binary Tree

文章目录 一、题目二、题解 一、题目 Given the root of a binary tree, the level of its root is 1, the level of its children is 2, and so on. Return the smallest level x such that the sum of all the values of nodes at level x is maximal. Example 1: Input:…