C++中auto关键字的用法详解

1.简介

auto作为一个C语言就存在的关键字,在C语言和C++之间却有很大区别。

在C语言中auto修饰的变量,是具有自动存储器的局部变量,但因为局部变量默认类别默认是auto修饰导致一直没有人去使用它。

C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一 个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得

而这就意味着auto定义变量时必须对其进行初始化

int TestAuto()
{return 10;
}
int main()
{int a = 10;auto b = a;auto c = 'a';auto d = TestAuto();cout << typeid(b).name() << endl;cout << typeid(c).name() << endl;cout << typeid(d).name() << endl;//auto e; 无法通过编译,使用auto定义变量时必须对其进行初始化return 0;
}

编译结果:img

注:

使用 auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto 的实际类型。因此auto并非是一种**“类型的声明,而是一个类型声明时的占位符”**,编译器在编译期会将auto****替换为变量实际的类型。

2.auto使用细则

  1. auto与指针和引用结合起来使用

用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须 加&

int main()
{int x = 10;auto a = &x;auto* b = &x;auto& c = x;cout << typeid(a).name() << endl;cout << typeid(b).name() << endl;cout << typeid(c).name() << endl;*a = 20;*b = 30;c = 40;return 0;
}
  1. 在同一行定义多个变量

当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译

器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。

void TestAuto()
{auto a = 1, b = 2; auto c = 3, d = 4.0;  // 该行代码会编译失败,因为c和d的初始化表达式类型不同
}

3. auto不能推导的场景

  1. auto不能作为函数的参数

因为编译器无法对a的实际类型进行推导

  1. auto不能直接用来声明数组
  2. 为了避免与C++98中的auto发生混淆,C++11只保留了auto作为类型指示符的用法
  3. auto在实际中最常见的优势用法就是跟以后会讲到的C++11提供的新式for循环,还有 lambda表达式等进行配合使用。

4.auto的好处

在C++中因为类,命名空间等语法会出现如std::map<std::string, std::string>::iterator这样的特别长的类别,若单纯用typedef来简略代码则会出现新的麻如:

typedef char* pstring;
int main()
{const pstring p1;    // 编译成功还是失败?const pstring* p2;   // 编译成功还是失败?return 0;
}

所以auto无疑是十分不错的选择

5、auto在C++14和C++17的更新

C++的auto关键字最初在C++11中引入,主要用于自动类型推导,使编程更简洁。在后续的C++14和C++17标准中,对auto的使用进行了一些扩展和更新,进一步提高了其灵活性和功能性。下面详细介绍这些更新:

C++14中对auto的更新

  1. 返回类型推导:
    在C++14中,auto可以用于推导普通函数的返回类型。这意味着你可以在函数定义时使用auto关键字指定返回类型,编译器会根据返回语句推导出具体的类型。这样做可以增加代码的可读性和灵活性,特别是在模板编程和使用lambda表达式时。

    示例:

    template<class T>
    auto add(T x, T y) {return x + y;
    }
    
  2. 泛型Lambda表达式:
    虽然Lambda表达式在C++11中就已经支持,但在C++14中增强了Lambda的能力,允许使用auto关键字作为参数类型,从而创建泛型Lambda。这样的Lambda可以接受任何类型的参数,提高了代码的复用性。

    示例:

    auto genericAdd = [](auto x, auto y) {return x + y;
    };
    

C++17中对auto的更新

  1. 类成员初始化:
    C++17允许在类中使用auto关键字来声明成员变量,并通过构造函数列表初始化语法默认成员初始化器来推导类型。这提供了一种更为灵活的方式来初始化类成员,特别是当类型表达式较为复杂或冗长时。

    示例:

    struct Example {auto value = 42;  // 自动推导为int
    };
    
  2. 模板参数推导:
    C++17引入了模板参数推导,这意味着在使用模板时不再总是需要显式指定模板参数。对于函数模板,如果使用auto来指定参数类型,编译器可以根据传递的实参推导出模板参数类型。

    示例:

    template<auto value> void printValue() {std::cout << value << std::endl;
    }int main() {printValue<42>();       // 输出: 42printValue<'A'>();      // 输出: A (字符'A'的ASCII值)
    }
    template<typename T, auto N>
    T fixed_multiply(T val) {return val * N;
    }int main() {auto result = fixed_multiply<int, 5>(2); // 输出: 10std::cout << result << std::endl;
    }

    在这个例子中,fixed_multiply函数模板接受一个类型为T的值和一个auto类型的常量N,然后返回乘积。在实例化时,N的类型会根据提供的常量自动推导。

  3. 结构化绑定:
    C++17还引入了结构化绑定,这允许使用auto来解构数组、结构体和tuple,从而更容易地访问复合数据类型的元素。

    示例:

    std::pair<int, double> p = {1, 2.3};
    auto [x, y] = p;  // x是int, y是double
    

这些更新让auto在C++中的应用更加广泛和灵活,尤其是在编写模板代码或者处理复杂类型时,大大简化了代码的编写。

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

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

相关文章

XY_RE复现(二)

一&#xff0c;何须相思煮余年 0x55 0x8b 0xec 0x81 0xec 0xa8 0x0 0x0 0x0 0xa1 0x0 0x40 0x41 0x0 0x33 0xc5 0x89 0x45 0xfc 0x68 0x9c 0x0 0x0 0x0 0x6a 0x0 0x8d 0x85 0x60 0xff 0xff 0xff 0x50 0xe8 0x7a 0xc 0x0 0x0 0x83 0xc4…

【智能算法】火烈鸟搜索算法(FSA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2021年&#xff0c;W Zhiheng等人受到火烈鸟迁徙觅食行为启发&#xff0c;提出了火烈鸟搜索算法&#xff08;Flamingo Search Algorithm, FSA&#xff09;。 2.算法原理 2.1算法思想 FSA受到火烈鸟…

C++|STL简介-string-vector基础运用

目录 什么是STL STL里面有什么 容器 string 序列式容器 vector deque list 关联式容器 set multiset map multimap 算法 非可变序列算法 可变序列算法 排序算法 数值算法 什么是STL STL(标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一…

MVC架构简述

MVC简介 MVC 是一种非常常见且常用的分层架构&#xff0c;主要包括&#xff1b;M - mode 对象层&#xff0c;封装到 domain 里。V - view 展示层&#xff0c;但因为目前都是前后端分离的项目&#xff0c;几乎不会在后端项目里写 JSP 文件了。C - Controller 控制层&#xff0c…

站群SEO优化策略及其遭遇DDoS攻击时的应对方法

一、站群SEO优化策略 站群优化主要是指通过合理布局和内容优化提升一系列网站在搜索引擎中的整体排名表现。以下是一些关键步骤与相关代码示例&#xff08;以WordPress为例&#xff09;&#xff1a; 差异化内容建设&#xff1a; 每个站点的内容必须具有独立性和价值性&#x…

CSS-vminvmax单位

vmin 和 vmax 单位 vmin 是相对于视口宽度和高度中较小值进行计算&#xff0c;它的值为视口宽度和高度中的较小值的百分比。 例如&#xff0c;如果视口宽度为 800px&#xff0c;高度为 1000px&#xff0c;那么 1vmin 等于 8px&#xff08;800px 的 1%&#xff09;。 vmax 是…

【Unity基础】TextMeshPro组件学习过程记录

目录 1.TextMeshPro组件渲染创建文本RTL Editor字体Font Asset字体加粗&#xff0c;下划线等字体大小控制字体颜色控制字体渐变控制字符间隔、单词间隔、行间距、段落间距控制WrappingUV映射控制代码 2.TextMeshPro组件AssetFace InfoGeneration Setting 3.使用Dynamic SDF Sys…

【可视化3D卷积计算过程】

目录 1. 可视化过程2. 代码验证 前言&#xff1a;开始处理视频数据&#xff0c;遇到了陌生又熟悉的3D卷积&#xff0c;但对其计算过程有点疑惑&#xff0c;网上也没找到什么可视化动画&#xff0c;所以研究明白并做个记录&#xff0c;方便日后复习。有点简化&#xff0c;但认真…

基于FCN网络实现的多类别图像分割任务

1、前言 FCN 作为图像分割的开山之作&#xff0c;将分割任务作为逐个像素点的分类任务 之前完成了基于unet、resnetunet、deeplab等等网络的分割任务&#xff0c;具体的可以参考本专栏&#xff1a; 图像分割_听风吹等浪起的博客-CSDN博客 因为FCN网络的实现较为复杂&#xf…

杰发科技AC7840——CAN通信简介(7)_波形分析

参考&#xff1a; CAN总线协议_stm32_mustfeng-GitCode 开源社区 0. 简介 隐形和显性波形 整帧数据表示 1. 字节描述 CAN数据帧标准格式域段域段名位宽&#xff1a;bit描述帧起始SOF(Start Of Frame)1数据帧起始标志&#xff0c;固定为1bit显性(b0)仲裁段dentify(ID)11本数…

网安行业拐点!网络安全6大企业2023年报盘点

回顾2023&#xff1a;寒冬中的市场概览 2023年&#xff0c;网络安全行业经历了前所未有的挑战。全球经济波动与行业竞争加剧&#xff0c;加之下游客户预算收紧&#xff0c;招投标流程延长&#xff0c;使得整个行业感受到了冬日的严寒。裁员和不发年终奖金的决定在行业中成为普…

记录些RAG-Fusion、Agent、NL2SQL的问题

RAG-Fusion RAG-Fusion 的实现原理 Query Duplication with a Twist&#xff1a;用 LLM 根据用户的 Query 生成几个相关的但不同的 Queries。Vector Search Unleashed&#xff1a;对原 Query 和生成的 Queries 都进行向量&#xff08;或者其他方式的&#xff09;搜索。Intell…

DiffusionGAN ——最快的小波扩散模型应用研究

介绍 扩散模型最近出现并迅速发展&#xff0c;吸引了许多研究人员的兴趣。这些模型能从随机的噪声输入生成高质量的图像。在图像生成任务中&#xff0c;它们的表现尤其优于最先进的生成模型&#xff08;GANs&#xff09;。扩散模型可以灵活地处理各种条件输入&#xff0c;从而…

meterpreter运行run getgui -e报错

meterpreter运行run getgui -e报错 meterpreter > run getgui -e [!] Meterpreter scripts are deprecated. Try post/windows/manage/enable_rdp. [!] Example: run post/windows/manage/enable_rdp OPTIONvalue [...] [-] The specified meterpreter session script cou…

【C++第三阶段】list容器排序

以下内容仅为当前认识&#xff0c;可能有不足之处&#xff0c;欢迎讨论&#xff01; 文章目录 构造函数赋值和交换大小操作插入和删除数据存取反转和排序排序案例 list容器在STL中是双向循环链表。 如图所示&#xff0c;每一个节点三个域&#xff0c;前向指针域&#xff0c;后…

用户中心(上)

文章目录 企业做项目流程需求分析技术选型计划初始化项目数据库设计登录/注册⽤户管理&#xff08;仅管理员可⻅&#xff09; 初始化项目⼀、前端初始化1.下载nodejs2.Ant Design Pro相关问题1.前端项目启动时报错、无法启动&#xff1f;2.如何初始化前端项目&#xff1f;为什么…

vue 模板字符串

1.模板字符串换行问题 white-space: pre-wrap; 2. 鼠标移入 显示提示框 点击手动隐藏 myChart.on("mouseover", function (params) {myChart.dispatchAction({type: "downplay",}); }); tooltip: {show: true, //是否显示提示框组件&#xff0c;包括…

机器人实验室CNRS-AIST JRL, IRL介绍

一、背景 作为搞机器人方向的学生&#xff0c;必须时常关注国际上顶尖实验室的研究成果&#xff0c;以免自己做的方向out&#xff0c;除了大家耳熟能详的Boston Dynamics&#xff0c;还有许多非常厉害的机器人实验室值得我们关注&#xff0c;如日本的CNRS-AIST JRL, IRL实验室…

spring cache(一)介绍

一、介绍 1、背景 项目中使用最多的缓存技术就是Redis,用Redis就可以实现了&#xff0c;为什么需要使用spring cache&#xff1f; 先看下我们使用缓存步骤: &#xff08;1&#xff09;查寻缓存中是否存在数据&#xff0c;如果存在则直接返回结果 &#xff08;2&#xff09…

虚函数表与虚函数表指针

虚函数表与虚函数表是用来实现多态的&#xff0c;每一个类只有一个虚函数表 静态多态&#xff1a;函数重载&#xff08;编译期确定&#xff09; 动态多态&#xff1a;虚函数&#xff08;运行期确定&#xff09; 虚函数表的创建时机&#xff1a; 生成时间&#xff1a; 编译期…