C++进阶 —— auto/decltype(C++11新特性)

iTunes登录协议逆向与自动化实现 本文详细解析了iTunes登录协议的逆向工程与自动化实现方法,涵盖请求体构造、签名生成和会话管理等关键技术。通过XML结构解析、X-Apple-ActionSignature生成原理及完整登录流程实现,帮助开发者高效完成iTunes自动化登录,提升工作效率。 阅读详情

目录

一,auto 类型推导

二,decltype 类型查询

实际应用

三,auto与decltype对比


        在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称;不过由于TC1主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯的把两个标准合称为C++98/03标准;从C++0x到C++11,C++标准十年磨一剑,第二个真正意义上的标准姗姗来迟; 相比于C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中约600个缺陷的修正,这使得C++11更像是从C++98/03中孕育出的一种新语言;相比较而言,C++11能更好地用于系统开放和库开发,语法更加泛化和简单化,更加稳定和安全,不仅功能强大,而且能提升程序员的开发效率;

一,auto 类型推导

        早期C/C++中,使用auto修饰的变量具有自动生命周期变量(多余,变量默认拥有自动的生命周期),但一直没有人去使用;C++11中,auto不在是一个存储类型标识符(如 static、register、mutable 等),而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在 编译时 推导而得;

// C++98/03,可以默认写成 int i = 0;
//默认自动具有生命周期;
auto int a = 0;  
//static会更改生命周期或链接属性
static int a = 0;

        由于定义变量时,必须先给出变量的实际类型,但有些情况可能不知道所需要实际类型,或类型书写起来特别复杂;在C++11中,可使用auto来根据变量初始化表达式类型推导变量的实际类型,可给程序的书写带来许多方便;

  • 使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型;
  • auto并非是一种类型的声明,而是一个类型声明时的占位符,编译器在编译时会将auto替换为实际变量类型;因为是编译时推导的,所以并不影响运行时的性能;
  • 为了避免与C++98中的auto混淆,C++11保留了auto作为存储类型标识符的用法;
  • auto实际中最常见的优势用法,是跟范围for循环及lambda表达式等进行配合使用;
//short取值范围-32768 ~ 32767
short a = 32670;
short b = 32670;
//如c类型为short,超过取值范围,数据会丢失
//short c = a + b;
//auto会自动根据a+b的结果推导出c的实际类型为int 
auto c = a + b;
//实际类型const int&
const auto& d = c;
map<string, string> mp{{"apple","苹果"},{"banana","香蕉"}};
//迭代器类型复杂
map<string, string>::iterator it = mp.begin();
//auto会自动推导出,书写非常方便,还不容易出错
auto it = mp.begin();

 auto使用细则

  • auto可与指针和引用结合起来使用,用auto声明指针类型时,用auto和auto*没有区别,但用auto声明引用类型时则必须加&;
  • 在同一行定义多个变量,但在同一行声明多个变量时,必须是相同类型,否则编译器报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量;
int a = 10;
int& ra = a;
auto b = a; //int
//推导指针
auto c = &a; //int*
auto* cc = &a; //int*
//推导引用
auto d = ra; //int
auto& dd = a; //int&
//定义多个变量,必须是相同类型
int a;string b;
//auto c = a, d = b;
  • 当声明不带引用时,auto 的推导结果不带 cv 限定符(const 和 volatile 限定符的统称)后类型一致;
  • 当声明带上引用时,auto 的推导结果将保持初始化表达式的 cv 属性;
const int& a = 1;
auto b1 = a; //推导类型为int
auto& b2 = a; //推导类型为const int&

auto不能推导的场景

  • auto不能作为函数的参数;
  • auto不能直接用来声明数组;
  • auto无法推导模板参数;
  • 不可在类内声明非静态auto成员变量;
//auto不能作为函数的参数
void fun(auto a){}
//auto不能直接用来声明数组
auto arr[] = { 1,2,3 };
//auto无法推导模板参数
vector<auto> v = { 1,2,3 };
//不可在类内声明非静态auto成员变量;
class Foo {
public:
	auto bar = "Hello, world!";   
};

二,decltype 类型查询

        auto使用的前提是,必须对auto声明的类型进行初始化,否则编译无法推导出实际类型;但有时候可能需要根据表达式运行完成之后结果的类型进行推导(因为编译期间,代码不运行),此时无法使用auto;需要程序运行完才能知道结果的实际类型,即RTTI(Run-Time Type Identification 运行时类型识别);运行时类型识别的缺陷,是降低程序运行的效率;

  • C++98中已经支持RTTI,typeid只能查看类型,不能用其结果定义类型;
  • dynamic_cast只能应用于含有虚函数的继承体系中;

        decltype 操作符(也是关键字),根据表达式(包括变量、函数调用、或者表达式等)在 编译时 进行类型查询,不会对操作数求值(类似sizeof);

//语法格式
decltype(expression) var;

        如 expression 是一个未被括号包围的变量名或类成员访问,则返回该变量所指对象的类型(包括 cv 限定符和引用等修饰符);

  • 可使用 std::remove_cv 和 std::remove_reference 进行去除修饰符;
const int a = 1;
const int& b = a;
decltype(a) var1 = 2; //推导类型为const int
decltype(b) var2 = b; //推导类型为const int&

std::remove_cv<decltype(a)>::type var3 = 2; //最终类型为int
std::remove_reference<decltype(b)>::type var4 = 2; //最终类型为const int

        如 expression 是一个左值表达式(且不是简单的标识符),则返回 T&,其中 T 是表达式的类型;

const int a = 1;
const int& b = a;
decltype((a)) var1 = 2; //(a)以变为左值表达式,推导类型为const int&
decltype((b)) var2 = a; //(b)以变为左值表达式,推导类型为const int&

如 expression 是一个右值,则返回 T,其中 T 是表达式的类型;

//推导a+b的实际类型来定义c的类型
decltype(1 + 1.0) c; //推导类型为double
cout << typeid(c).name() << endl;

    如 expression 是一个函数,则返回该函数返回值的类型;

    const char fun();
    decltype(fun()) b = 1; //推导类型为char
    const decltype(fun()) b = 1; //推导类型为const char
    
    const char* fun();
    decltype(fun()) b; //推导类型为const char*
    
    const char& fun();
    decltype(fun()) b = 1; //推导类型为const char&
    void* GetMemory(size_t size){return malloc(size);}
    
    int main() {
    	//只是推演,不会执行函数
    	cout << typeid(GetMemory).name() << endl; //void * __cdecl(unsigned int)
    	cout << typeid(GetMemory(0)).name() << endl; //void *
    }

    实际应用

    • 推导函数返回值类型(auto结合decltype构成返回类型后置语法);
    //auto此时无类型推导含义,只是返回类型后置语法的组成部分
    auto add(int a, int b)->decltype(a + b)
    {
    	return a + b;
    }
    • 推导 lambda 表达式类型;
    auto lambda_fun = [](int a, int b) -> decltype(a + b)
    {
    	return a + b;
    };
    • 推导模板参数类型;
    template<typename T1, typename T2>
    auto add(T1 a, T2 b) -> decltype(a + b) {
    	return a + b;
    }
    //C++14 中引入的类型推导关键字
    //推导出返回值类型,并保留了原有变量的类型和修饰符
    template<typename T>
    decltype(auto) func(T&v1)  //可把auto理解成要推导的类型,推导过程我们采用decltype
    {
       return v1;
    }

    三,auto与decltype对比


     

    请举手回答,LDO和DC-DC有什么不同? 文章目录1 LDO是什么2 LDO典型电路3 DC-DC是什么4 DC-DC典型电路5 LDO和DC-DC区别10.2.6 小结一下 大家好,我是记得诚。 DC-DC和LDO都是电源芯片,两者差异很大,用法也不同,这篇博客讲述LDO和DC-DC的一些差异,帮助更好的认识LDO和DC-DC并进行选型。 1 LDO是什么 LDO是low dropout regulator的简称,即低压差线性稳压器,这是相对于传统的线性稳压器来说的,传统的稳压器,输入比输出要高出很多,否则无法工作,LDO可能输入比输出高1~2V 阅读详情

    相关推荐

    PX4/ArduPilot源码克隆提速秘籍:国内镜像与子模块优化全攻略

    本文详细介绍了PX4/ArduPilot源码克隆的提速秘籍,包括使用国内镜像源和子模块优化技巧。通过阿木实验室、华为云等国内镜像,克隆速度可提升20倍,同时提供子模块替换和并行编译等实用方法,大幅提升开发效率。

    weixin_29251567的博客 523

    C++11:使用 auto/decltype/result_of使代码可读易维护

    C++11 终于加入了自动类型推导。以前,我们不得不使用Boost的相关组件来实现,现在,我们可以使用“原生态”的自动类型推导了! C++引入自动的类型推导,并不是在向动态语言(强类型语言又称静态类型语言,是指需要进行变量/对象类型声明的语言,一般情况下需要编译执行。例如C/C++/Java;弱类型语言又称动态类型语言,是指不需要进行变量/对象类型声明的语言,一般情况下不需要编译(但也有编译

    anzhsoft的技术专栏 1万+

    Ollama安装教程

    Ollama 是一个开源的大语言模型(LLM)部署工具,专为在本地机器部署和运行大模型而设计,通过简单的命令就可以在本地快速运行大模型(如DeepSeek、Llama、Gemma、QWQ等)。非常适合开发者、研究人员以及对数据安全和隐私有较高要求的企业和用户

    学习AI应用开发,分享AI干货、获取最新AI咨询 3847

    任鸟飞逆向C++进阶篇

    【课程简介】本课程为任鸟飞逆向C++进阶篇,注重基础理论的务实和简单功能的实现,学员学成后,可独立判断、分析和解决逆向问题、独立编写通用辅助。本套课程不只是一套深入学习C++的课程,更是一套深入学习汇编逆向课程、外挂与反外挂、软件安全的课程。逆向思路技术随笔,请关注我的优快云博客:https://blog.youkuaiyun.com/qq_36553941 欢迎大家来学习交流,活动折扣等信息也在其第一时间发布。PS: 课程中工具包、源码、课件请关注第一章的第一节的随课课件,工欲望善其事,必先利其器! 【学前预备知识】任鸟飞逆向C++系列课程是一条精心安排为掌握汇编逆向、外挂与反外挂、软件安全的学习路线,包括但不限于 基础篇、进阶篇(本篇)、高级篇、实战篇等,所以为保证您能学有所成请在学习本篇之前务必掌握基础篇!!!基础篇优快云学院链接:https://edu.youkuaiyun.com/course/detail/30509 【学员学成收获】1、C++编程语言进阶。2、游戏逆向分析进阶。3、游戏安全对抗理论进阶。4、独立编写通用辅助。 

    fdtd(时域有限差分)仿真

    基础入门阶段采用 Step by step 的教学方式带着做具体的案例,在案例中学习 FDTD 应用的。的痛难点,将 FDTD 仿真引入实验当中,通过软件可视化处理有效直观的展示仿真的流程,与实验数。图像传感器,OLED 和液晶,表面计量,表面等离子体,石墨烯,太阳能电池,集成光子组件,超材。料,衍射光学和光子晶体。波,场极化,磁场,周期性结构,半球功率积分等设计解决方案,提供时域有限差分分析函数,时域。子光学传感器、热电子光探测器的光学特性研究、光学微腔宽带吸收器等多个方向的研究方法。

    y2715163545的博客 5431

    python123题目——摩尔斯电码转换

    类型:列表元组。

    m0_62488776的博客 4416

    C++:auto与decltype

    auto 关键字用来指明变量的存储类型,它和 static 关键字是相对的。auto 表示变量是自动存储的,这也是编译器的默认规则,所以写不写都一样,一般我们也不写,这使得 auto 关键字的存在变得非常鸡肋。decltype 是 C++11 新增的一个关键字,它和 auto 的功能一样,都用来在编译时期进行自动类型推导

    m0_67505039的博客 767

    计算pi小数点后10000位

    数据结构课上,老师让我们计算一下pi的10000位,复习一下面向对象。 First Try:定义一个高精度类hp(high precision),实现加减乘除,输入输出,然后随便找一个公式,比如Wallis公式,全都用hp进行计算。 现实是:大数乘大数或者大数除大数,实在是太慢了。而且Wallis公式收敛太慢。 Second Try先找到一个收敛较快的公司:BBP公式,观察公式发现,...

    我的技术人生 7394

    【C++】浅谈C++中的auto和decltype

    目录1. auto1.1 对于auto的一些使用规则2. decltype2.1 decltype返回值类型追踪 对于上面的这两种情况我们可以用auto和decltype来解决: 运行结果:下面我们来具体介绍auto和decltype 1.对于用auto修饰的变量一定要初始化 运行结果:可以看到auto可以自动识别变量的类型2. 注意auto是不可以作为函数的参数和返回值的这是因为用auto修饰的变量必须要初始化,这样才能在编译阶段推断出变量的类型,而函数的参数和返回值在程序运行阶段才能确定,

    weixin_45897952的博客 1836

    [cryoEM] cryoSPARC简介

    cryoSPARC系统结构概述 cryoSPARC是一个后端和前端高性能计算软件系统,为单颗粒冷冻电镜提供数据处理和图像分析能力,以及丰富的基于浏览器的用户截面和命令行工具。 Master-worker模式 系统基于主用户模式。 主进程(web应用,核心应用程序和MongoDB数据库)一起在主节点上运行。主节点需要相对轻量级的资源(2+ CPU< 16GB+ RAM)。 工作程序进程可以在具有GPU的任何可用节点上生成,负责所有实际计算和数据处理,并由主节点调度。注意:同一节点可以同时充当主节点和辅

    进阶中的程序员吃吃的博客 7796

    Windows10下安装VMware16虚拟机

    由于本人系统为Windows 10 家庭中文版,无法安装Linux子系统WSL,虽然网上也有强制安装的方法,但为保险起见,还是把之前的VMware虚拟机重新进行安装,并浅浅记录一下安装过程。

    沉香best的博客 863

    【C++】自动推断变量类型——auto和decltype

    1. auto 2. decltype

    Qiuhan_909的博客 1225

    微信支付PHP集成指南

    完整实现建议参考微信支付官方文档,包含更多支付场景(H5支付、Native支付等)和安全性处理细节。微信支付在PHP中的集成主要涉及服务端接口的调用和支付流程的实现。

    bqq506615054的专栏 155

    [C++] - auto的使用、优点和缺点

    Table of Contents 1.auto的优点 1>避免未初始化变量 2>避免冗长的变量声明 3>具有直接持有闭包(closure)的能力 4>type shortcuts 类型捷径 2.auto的缺点 1>不适用invisible proxy class 2>Braced Initializer 类型推断 1.auto的优点 1>避免未初始化变量 auto变量从它们的初始化式中推断它们的类型,所以它们必须被初始化。这意味着你可以免受很

    浮生的博客 1万+

    锂电池充电器电路设计 里面有电路

    锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

    visio安装包

    Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

    C++11新特性— auto 和 decltype 区别和联系

    编程时候常常需要把表达式的值付给变量,需要在声明变量的时候清楚的知道变量是什么类型。然而做到这一点并非那么容易(特别是模板中),有时候根本做不到。为了解决这个问题,C++11新标准就引入了auto类型说明符,用它就能让编译器替我们去分析表达式所属的类型。和原来那些只对应某种特定的类型说明符(例如 int)不同。auto 让编译器通过初始值来进行类型推演。从而获得定义变量的类型,所以说 auto 定义的变量必须有初始值。 有的时候我们还会遇到这种情况,我们希望从表达式中推断出要定义变量的类型,但却不想用表达式

    YzlCoder的记事本 2万+

    复分析 阿尔福斯(Ahlfors) 第三版答案 英文

    答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

    有auto为什么还要decltype ?详解decltype的用法

    decltype用法auto和decltype推导类型的区别decltype用法:1.decltype变量2.==decltype表达式==2.1 表达式做右值2.2 表达式能做左值3. decltype 函数3.1 decltype(f())3.2 decltype(f)C++ 11 中decltype的主要作用 auto和decltype推导类型的区别 在中,我介绍了auto的用法及其实际编程中的应用,既然auto可以推导变量的类型,为什么C++11还引进decltype类型说明符呢?关于这一点,C++

    weixin_43744293的博客 4118

    WINCC7.3破解文件

    WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

    C++11 auto decltype

    允许编译器根据变量的初始化表达式自动推导其类型,无需显式指定。​基本用法 ​推导规则 ​常见应用场景 ​范围 循环: ​泛型编程: ​注意事项 避免推导为不期望的类型(如 ): 二、 关键字 ​作用 返回表达式 的类型,保留顶层 和引用,且不计算 的值。​基本用法 ​推导规则 ​常见应用场景 ​模板元编程:

    azaz_plus的博客 1245

    【C++】深入理解decltype和decltype(auto)

    decltype关键字是C++11新标准引入的关键字,它和关键字auto的功能类似,也可以自动推导出给定表达式的类型,但它和auto的语法有些不同,auto推导的表达式放在的右边,并作为auto所定义的变量的初始值,而decltype它的语法像是函数调用,但它不是函数调用而是运算符,和sizeof运算符类似,在编译期间获取他的类型,表达式expr不会被真正执行,因此不会产生汇编代码。decltype和auto用auto定义变量时必须提供初始值表达式,利用初始值表达式推导出类型并用它作为变量的初始值,使用。

    一点一点变好 2778

    【C++课程学习】:C++11(C++发展,列表初始化,声明auto,typeid,decltype)

    (下面介绍来源于---文心一言)⛳️起源阶段:1979年,丹麦计算机科学家比雅尼·斯特劳斯特鲁普(Bjarne Stroustrup)发现C语言在表达能力、可维性和可展性方面的不足,开始对其进行了一系列的改进。斯特劳斯特鲁普在贝尔实验室开始从事将C改良为带类的C()的工作。他希望开发一个既要编程简单、正确可靠,又要运行高效、可移植的计算机程序设计语言。而以C语言为背景,以Simula思想为基础的语言,正好符合他的初衷和设想。

    路虽远,行则将至!事虽难,做则必成! 4977

    【c++】c++11新特性(列表初始化,initializer_list,auto和decltype,STL中的一些变化)

    前言 一、c++11简介 背景 介绍 二、统一的列表初始化 三、initializer_list 四、auto和decltype auto decltype 五、nullptr 六、范围for 七、STL中的一些变化 新容器 新接口 总结

    重铸自身根基的博客 1244

    C++11新特性之decltype类型推导

    C++新特性之decltype类型推导

    Serven的博客 1万+

    深入解析C++ decltype和decltype(auto)

    decltype关键字是C++11新标准引入的关键字,它和关键字auto的功能类似,也可以自动推导出给定表达式的类型,但它和auto的语法有些不同,这篇文章讲解了decltype的使用场景以及和auto不同的地方,同时也讲解了和auto结合使用的用法。

    iShare_Carlos的博客 1345

    C++11 中 auto 和 decltype 的深入解析

    在定义 STL 容器的迭代器时,auto非常有用,因为迭代器的类型通常很复杂。it!auto和decltype是 C++11 引入的两个强大的类型推导工具,它们在简化代码、提高类型安全性方面发挥了重要作用。auto主要用于自动推导变量的类型,特别是在处理复杂类型或模板类型时;而decltype主要用于查询表达式的类型,特别是在模板编程中推导函数返回类型。理解这两个关键字的工作原理和应用场景,有助于我们编写更加高效、可读性强的 C++ 代码。

    码事漫谈 1281

    C++ 11新特性之auto和decltype

    在C++ 11标准中,引入了两大关键类型推导机制,即:auto关键字和decltype表达式。这两个特性不仅极大地简化了代码编写,提升了可读性,还为开发者提供了更加灵活、直观的类型声明方式。本文将详细解读auto和decltype的概念、工作原理及其在实际编程中的应用。auto和decltype是C++ 11中增强类型安全、简化代码的重要工具,它们通过提供类型推断功能使得程序更加简洁易读,同时也提高了开发效率。熟练掌握这两种特性,有助于编写更高质量、更具扩展性的现代C++代码。

    hope_wisdom的技术博客 935

    C++之 auto和decltype 区别 、详解

    何时使用何种类型推导:│ 使用 auto │ 使用 decltype│ 简化变量声明 │ 需要精确类型│ 范围for循环 │ 模板元编程│ Lambda存储 │ 表达式类型分析│ 代码可读性优先 │ 类型系统精确控制两者配合使用可以写出既简洁又类型安全的现代C++代码。

    qq_31266667的博客 1696

    二、C++11新特性:decltype类型推导

    目录二、decltype类型推导2.1、 decltypedecltype和auto的异同:2.2、decltype的应用①、decltype和typedf/using合用②、deltype在某些场景下使用增加代码的可读性③、使用decltype重用匿名类型④、decltype可以适当扩大模板泛型的能力2.3、decltype推导规则①、表达式为普通变量或者普通表达式或者类表达式,在这种情况下,使用 decltype 推导出的类型和表达式的类型是一致的。②、表达式是函数调用,使用 decltype 推导出的

    kevin的博客 4136
    上一篇: C++进阶 —— 哈希
    下一篇: C++进阶 —— 异常
    挨代码
    博客等级 码龄5年 1696粉丝 384原创
    评论
    成就一亿技术人!
    拼手气红包6.0元
    还能输入1000个字符
     
     条评论被折叠 查看
    添加红包

    请填写红包祝福语或标题

    个

    红包个数最小为10个

    元

    红包金额最低5元

    当前余额3.43元 前往充值 >
    需支付:10.00元
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付元
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值