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

Ansys Maxwell磁场仿真入门:无线传能线圈自感与互感计算全流程 本文详细介绍了使用Ansys Maxwell进行无线充电线圈磁场仿真的全流程,包括模型建立、求解器设置、电感参数提取及优化策略。通过实战案例,帮助工程师掌握线圈自感与互感计算技巧,提升无线充电系统设计效率与精度。重点解析了Maxwell在磁场仿真中的关键应用,适用于电磁场仿真初学者和进阶用户。 阅读详情

目录

一,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对比


     

    62. 如何通过增强(Enhancement) 的方式给 SAP ABAP 标准程序增添新功能 本文通过一个实际的例子,介绍了如何不通过修改 SAP 标准 ABAP 程序源代码的方式,对其的功能进行增强,即采取 ABAP 增强开发的方式进行二次开发,这是一种在实际 SAP 项目实施过程中使用非常广泛的技术。 阅读详情

    相关推荐

    LiveGBS流媒体平台GB/T28181实战指南:海康NVR物联网卡摄像头注册失败全链路排查与抓包技巧

    本文详细解析了LiveGBS流媒体平台中海康NVR物联网卡摄像头注册失败的常见问题及解决方案。通过全链路排查与抓包技巧,包括物联网卡配置、多网卡冲突处理、防火墙设置等,帮助用户快速定位并解决GB/T28181协议下的设备注册难题,提升流媒体平台部署效率。

    weixin_29290947的博客 492

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

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

    anzhsoft的技术专栏 1万+

    医学超声影像研究——从拒稿到录用:我的UMB投稿实战复盘

    本文分享了作者将一篇关于超声影像中肿瘤传统分类方法的研究论文,从被其他期刊拒稿到最终被《Ultrasound in Medicine & Biology》录用的完整实战经验。文章详细复盘了心态调整、精准选刊、针对UMB期刊的稿件精修、投稿系统操作细节以及与审稿人有效沟通回复的全过程,为医学影像领域的科研工作者提供了宝贵的投稿策略与实操指南。

    stem5的博客 492

    任鸟飞逆向C++进阶篇

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

    基于STM32的宠物智能照护嵌入式系统设计

    嵌入式系统是实现物联网终端设备本地化感知、决策与执行的核心技术载体,其关键在于多传感器融合、低功耗执行控制与轻量级云边协同。本文围绕环境监测(温湿度、烟雾、余粮)、机电执行(步进电机食盘、继电器风扇)和可靠通信(MQTT+ESP8266)三大技术主线,深入解析STM32F103在资源约束下的外设调度策略、ADC采样抗干扰设计、DHT11时序精准控制及HX711称重滤波算法等工程实践要点。系统强调本地闭环优先原则,确保离线基础功能可用,同时通过阿里云IoT平台实现远程监控与告警联动,为中小型智能硬件项目提供可

    weixin_29155599的博客 293

    基于STM32的电子琴音乐播放器设计

    ​ 本设计以实际电路为最后的结果,实现了所有与其功能,具有重要的现实意义。件,在Proteus中进行原理图绘制,然后把 .hex文件下载到STM32F103RBT6中 进行仿真。由于网络上 下载的 Proteus中 没有 STM32F103RBT6这个芯片型号,我们又从网上 下载芯片 进行仿真。​ 本设计以实际电路为最后的结果,实现了所有与其功能,具有重要的现实意义。

    TMMXA的博客 2万+

    C++:auto与decltype

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

    m0_67505039的博客 767

    【25届数字IC秋招总结】面试经验10——紫光同芯

    25届数字ic面试记录——紫光同芯

    lalala0635的博客 862

    【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

    LVGL 组件对齐方式说明

    本文说明 LVGL(以 v8 为例)中常用的 lv_align_t对齐选项的含义与用法,对应界面设计工具里下拉列表中的以及等命名。

    摸鱼专家 130

    华为OD机试真题 新系统【小花获胜的奶茶】

    华为OD机试真题 新系统【小花获胜的奶茶】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【小花获胜的奶茶】多语言题解。

    qq_45776114的博客 382

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

    1. auto 2. decltype

    Qiuhan_909的博客 1225

    2026年江苏省职业院校技能大赛高职组“软件测试”赛项智能体辅助测试参考答案

    2026年江苏省职业院校技能大赛高职组“软件测试”赛项智能体辅助测试参考答案

    我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 1324

    [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万+

    WINCC7.3破解文件

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

    计算机控制技术及应用

    《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

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

    YzlCoder的记事本 2万+

    VB摄像头监控

    该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

    有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

    LinePhone3.2.7(android端最新版本) sip客户端

    SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

    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、付费专栏及课程。

    余额充值