【C++】 C++11 新特性探索:decltype 和 auto

▒ 目录 ▒

    • 🛫 问题
      • 描述
      • 环境
    • 1️⃣ decltype
      • 推导变量类型
      • 推导函数返回类型
    • 2️⃣ auto
      • 自动推导变量类型
      • 迭代器和范围循环
    • 3️⃣ decltype 和 auto 同时使用
    • 🛬 结论
    • 📖 参考资料

🛫 问题

描述

C++11 引入了一些强大的新特性,其中包括 decltype 和 auto。本文将深入探索这两个关键字的作用和用法,并展示它们在现代 C++ 开发中的实际用例。

环境

版本号描述
文章日期2023-12-16

1️⃣ decltype

decltype 关键字用于推导表达式的类型,它可以根据表达式的结果推断出返回类型。它的语法如下所示:
decltype(expression)

推导变量类型

使用 decltype 可以方便地推导变量的类型,尤其是在复杂的模板编程场景下。例如,我们可以通过以下方式声明一个与已有变量类型相同的新变量:

int x = 42;
decltype(x) y; // 声明一个与 x 类型相同的变量 y

推导函数返回类型

decltype 还可以用于推导函数的返回类型。在某些情况下,函数的返回类型可能会非常复杂,使用 decltype 可以避免手动编写冗长的类型说明。例如:

int foo();
float bar();

decltype(foo()) result1; // 推导出 foo() 的返回类型
decltype(bar()) result2; // 推导出 bar() 的返回类型

2️⃣ auto

auto 关键字用于自动推导变量的类型,它可以根据变量的初始值推断出最合适的类型。它的语法如下所示:auto variable = expression;

自动推导变量类型

使用 auto 关键字可以更加简洁地声明变量,并且不需要显式指定变量的类型。编译器会根据变量的初始值自动推断出最合适的类型。例如:

auto x = 42; // x 的类型被推断为 int
auto y = 3.14; // y 的类型被推断为 double
auto z = "Hello"; // z 的类型被推断为 const char*

迭代器和范围循环

auto 关键字在处理容器迭代器和范围循环时非常有用。通过使用 auto,我们可以简化代码并避免繁琐的类型声明。例如:

std::vector<int> numbers = {1, 2, 3, 4, 5};

// 使用 auto 迭代容器元素
for (auto it = numbers.begin(); it != numbers.end(); ++it) {
    std::cout << *it << " ";
}

// 使用范围循环
for (auto number : numbers) {
    std::cout << number << " ";
}

3️⃣ decltype 和 auto 同时使用

经常写函数指针的情况,以前往往需要写大量定义。C11后(C17更强大)可以如下两种方式编写,代码更少更方便了。

  • decltype(auto) func = &MessageBoxA;
  • auto func2 = decltype(&MessageBoxA)MyMessageBoxA;
    在这里插入图片描述

🛬 结论

decltype 和 auto 是 C++11 引入的两个重要关键字,它们为我们提供了更强大、更灵活的类型推导和变量声明方式。通过使用 decltype,我们可以方便地推导表达式和函数的返回类型;而使用 auto,则可以自动推导变量的类型,使代码更加简洁
这两个关键字在现代 C++ 开发中广泛应用于模板编程、容器操作和范围循环等场景。
然而,需要注意的是过度使用 decltype 和 auto 可能会导致代码可读性下降。在某些情况下,明确指定变量类型和函数返回类型可能更加明确和易于理解。因此,在使用这两个关键字时,我们应该权衡代码的简洁性和可读性,并根据实际情况做出合适的选择。

📖 参考资料

  • decltype (C++) https://learn.microsoft.com/zh-cn/cpp/cpp/decltype-cpp?view=msvc-170

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【python】Debian安装miniconda、spyder、tushare

1. miniconda 安装 — 动手学深度学习 2.0.0 documentation中有安装Miniconda的一些说明。 Miniconda — miniconda documentation是Miniconda网站&#xff0c;里面也有安装说明。 Debian安装按照linux安装即可&#xff1a; mkdir -p ~/miniconda3 wget https://repo.anaco…

软实力篇---第五篇

系列文章目录 文章目录 系列文章目录前言一、HR 最喜欢问程序员的 20 个问题二、面试中的礼仪与举止前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、HR 最喜欢…

机器学习---协同过滤

协同过滤&#xff08;Collaborative Filtering&#xff09;技术&#xff0c;是推荐系统中应用最为广泛的技术之一&#xff0c;协同过滤算法主要有两种&#xff0c;一种是基于用户的协同过滤算法(UserBaseCF)&#xff0c;另一种是基于物品的协同过滤算法(ItemBaseCF&#xff09;…

直接插入排序_希尔排序

文章目录 直接插入排序原理步骤视频演示代码实现特性 希尔排序原理步骤图像演示代码实现希尔排序的分析特性 直接插入排序和希尔排序的比较 直接插入排序 直接插入排序&#xff08;Straight InsertionSort&#xff09;是一种最简单的排序方法&#xff0c;其基本操作是将一条记录…

腾讯云:AI云探索之路

随着科技的飞速发展&#xff0c;人工智能(AI)云计算领域日益显现出其巨大的潜力和价值。在这个充满挑战和机遇的领域&#xff0c;腾讯云凭借其卓越的技术和创新能力&#xff0c;取得了令人瞩目的成果。本文将深入探讨腾讯云在AI云计算领域的优势&#xff0c;以及其为人工智能发…

Multi-sensor KIT-V3.0 多传感器开发板

Multi-sensor KIT-V3.0 多传感器开发板 1.前言1.1 特点 2. Multi-sensor KIT QMA8658A-EVB QMC5883评估板的扩展2.1 特点 3. Multi-sensor KIT &#xff08;QMA8658A-EVB QMC5883&#xff09; Ultrasonic-CH-X01-EVB评估板的扩展3.1 特点 4.资料资源Multi-sensor KIT-V3.0 …

基于Hadoop的农产品价格信息检测分析系统

基于Hadoop的农产品价格信息检测分析系统 前言数据处理模块1. 数据爬取2. 数据清洗与处理3. 数据存储 数据分析与检测模块1. 农产品价格趋势分析2. 农产品价格检索3. 不同市场价格对比 创新点 前言 为了更好地了解农产品市场价格趋势和不同市场之间的价格差异&#xff0c;我设…

swing快速入门(十五)

注释很详细&#xff0c;直接上代码 上一篇 新增内容 1.文件对话框&#xff08;保存文件&#xff09; 2.文件对话框&#xff08;打开文件&#xff09; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener;public class swing_tes…

飞天使-docker知识点4-harbor

文章目录 Harbor安装完成harbor 官方建议方式之后查看 images配置docker 使用harbor 仓库上传下载镜像docker 镜像结合harbor 运行 Harbor Harbor 是一个用于存储和分发 Docker 镜像的企业级 Registry 服务器&#xff0c;由 vmware 开源&#xff0c;其通过添加一些企业必需的功…

前后端开发鄙视链的真相,希望对从事前后端开发的小伙伴有些帮助

一、常规的工资对比 前后端的工资情况怎么样?过来人可以负责任的告诉大家:据我所知,至少在杭的网易、阿里,前端跟后端是一个批发价。

【PostgreSQL】从零开始:(二)PostgreSQL下载与安装

【PostgreSQL】从零开始:&#xff08;二&#xff09;PostgreSQL下载与安装 Winodws环境下载与安装PostgreSQL下载PostgreSQL安装PostgreSQL1.登录数据库2.查看下我们已有的数据库 Liunx环境下载与安装PostgreSQL使用YUM下载安装PostgreSQL1.下载PostgreSQL安装包2.安装PostgreS…

DCN神州数码WAF-P-2021命令行恢复出厂

注意&#xff1a;执行该命令将会清除设备的所有配置信息&#xff0c;包括网络配置、安全策略等&#xff0c;并将设备恢复到出厂设置时的默认配置。在执行该操作之前&#xff0c;请务必备份重要的设备配置信息。 Console接入波特率9600&#xff0c;输入帐号密码admin/yunke1234…

Mac安装软件显示文件已损坏处理方法

今天安装软件&#xff0c;突然遇到了文件已损坏&#xff0c;扔到废纸篓的情况&#xff0c;于是搜索了下解决办法&#xff0c;跟大家分享下&#xff0c;希望对你有所帮助 一、检查安全性设置 打开【设置】-【隐私与安全】&#xff0c;下拉找到安全性&#xff0c;将安全性更改为…

【动态规划】06路径问题_不同路径II_C++(medium)

题目链接&#xff1a;leetcode不同路径II 目录 题目解析&#xff1a; 算法原理 1.状态表示 2.状态转移方程 3.初始化 4.填表顺序 5.返回值 编写代码 题目解析&#xff1a; 题目让我们求在考虑网格中有障碍物的情况下&#xff0c;从左上角到右下角将会有多少条不同的路径…

JVM虚拟机系统性学习-垃圾回收器CMS、G1和ZGC

CMS&#xff1a;低延迟 在 JDK1.5 时&#xff0c;HotSpot 推出了 CMS 收集器&#xff0c;CMS 收集器是 HotSpot 虚拟机中第一款真正意义上的并发收集器&#xff0c;它第一次实现了让垃圾收集线程和用户线程同时工作CMS 收集器关注尽可能地降低用户线程的停顿时间&#xff0c;停…

linux常见错误

1.E45: ‘readonly‘ option is set (add ! to override) 首先使用以下命令从Vim编辑器中出来&#xff1a;:qa!(强制退出) 接下来&#xff0c;使用sudo vim filename和更高版本&#xff1a;:wq 2.Bash script – "/bin/bash^M: bad interpreter: No such file or direc…

如何退回chrome旧版ui界面?关闭Chrome浏览器新 UI 界面

之前启用新UI的方式 Chrome 已经很久没有进行过大的样式修改&#xff0c;但近期在稳定分支中添加了新的 flags 实验性标志&#xff0c;带来了全新的设计与外观&#xff0c;启用方式如下&#xff1a; 在 Chrome 浏览器的搜索栏中输入并访问 chrome://flags 搜索“refresh 2023…

高效营销系统集成:百度营销的API无代码解决方案,提升电商与广告效率

百度营销API连接&#xff1a;构建无代码开发的高效集成体系 在数字营销的高速发展时代&#xff0c;企业追求的是快速响应市场的能力以及提高用户运营的效率。百度营销API连接正是为此而生&#xff0c;它通过无代码开发的方式&#xff0c;实现了电商平台、营销系统和CRM的一站式…

第十一章 SpringCloud Alibaba 实现Rocketmq–消息驱动

MQ简介 什么是MQ MQ&#xff08;Message Queue&#xff09;是一种跨进程的通信机制&#xff0c;用于传递消息。通俗点说&#xff0c;就是一个先进先出的数 据结构。 MQ的应用场景 异步解耦 最常见的一个场景是用户注册后&#xff0c;需要发送注册邮件和短信通知&#xff…

Qt中槽函数在那个线程执行的探索和思考

信号和槽是Qt的核心机制之一&#xff0c;通过该机制大大简化了开发者的开发难度。信号和槽属于观察者模式&#xff08;本质上是回调函数的应用&#xff09;。是函数就需要考虑其是在那个线程中执行&#xff0c;本文讨论的就是槽函数在那个线程中执行的问题。 目录 1. connect…