C++11:自动类型推导 auto 和 decltype(上)

在 C++11标准中,引入了两个非常有用的关键字:autodecltype。这两个关键字在提高编码效率、代码可读性以及维护性方面起到了巨大作用。今天,我们将深入探讨 auto的用法,并通过实际的代码示例来说明怎么使用它。

auto 的用法

关键字 auto 允许编译器自动推导变量的类型,从而使程序员不必显式地指定它们。这一特性在处理复杂类型或模板编程时尤为有用,能够使代码更加简洁明了。

1、基本用法

在最基本的用法中,auto 可以用于变量声明,让编译器自动推导变量的类型。

auto x = 5; // x 被推导为int
auto y = 3.14; // y 被推导为double
auto p = &x; // &x 的结果是 int* 指针,所以推导出 p 的类型是 int*
auto url = "https://kangxishuo.com"; // 双引号包围起来的字符串是 const char*,所以推导出 url 的类型是 const char*

2、用于迭代器

在容器操作中,auto 可以简化迭代器的声明,这也是 auto 的典型应用场景。

std::vector<int> vec = {1, 2, 3, 4, 5};
for(auto it = vec.begin(); it != vec.end(); ++it) {std::cout << *it << " ";
}

3、用于函数返回类型

C++14 进一步扩展了 auto 的用法,允许用它来指定函数的返回类型。

auto add(int x, int y) -> int {return x + y;
}

4、用于范围for循环

auto 可以在范围 for 循环中用来自动推导元素类型。

std::vector<int> vec = {1, 2, 3, 4, 5};
for(auto elem : vec) {std::cout << elem << " ";
}

5、用于泛型编程

泛型编程中,当我们不知道变量的类型,或者不希望指明具体类型的时候,可以使用 auto

#include <iostream>
using namespace std;class A{
public:static int get(void){return 100;}
};class B{
public:static const char* get(void){return "https://kangxishuo.com/";}
};template <typename T>
void func(void){auto val = T::get();cout << val << endl;
}int main(void){func<A>();func<B>();return 0;
}// 运行结果
// 100
// https://kangxishuo.com/

本例中的模板函数 func() 会调用类的静态函数 get(),并对它的返回值做统一处理,但是 get() 的返回值类型并不一样,而且不能自动转换。这种要求在以前的 C++ 版本中实现起来非常麻烦,需要额外增加一个模板参数,并在调用时手动给该模板参数赋值,用以指明变量 val 的类型。

但是有了 auto 类型自动推导,编译器就根据 get() 的返回值自己推导出 val 变量的类型,就不必再增加一个模板参数。

6、结合 decltype使用

有时候,我们希望定义一个变量,其类型与某个表达式的类型完全相同,这时就可以结合 decltypeauto 使用。

decltype(auto) var = x; // 若x的类型是int,则var的类型也为int

7、autoconst 结合

auto 与 const 结合的用法:

  • 当类型不为引用时,auto 的推导结果将不保留表达式的 const 属性;
  • 当类型为引用时,auto 的推导结果将保留表达式的 const 属性。

我们通过实例理解一下:

int x = 0;
const auto n = x;  //n 为 const int ,auto 被推导为 int
auto f = n; //f 为 const int,auto 被推导为 int(const 属性被抛弃)
const auto &r1 = x; //r1 为 const int& 类型,auto 被推导为 int
auto &r2 = r1; //r1 为 const int& 类型,auto 被推导为 const int 类型`在这里插入代码片`

auto 的限制

1、使用 auto 的时候必须对变量进行初始化,否则无法推断变量类型。

2、auto 不能在函数的参数中使用。

3、auto 不能作用于类的非静态成员变量(即没有 static 修饰的成员变量)。

4、auto 关键字不能定义数组,例如,下面的例子是错误的:

char url[] = “https://kangxishuo.com/”;
auto str[] = url; //str 为数组,所以不能使用 auto

5、auto 不能作用于模板参数,看下面的例子:

template <typename T>
class A{//……
};
int  main(){A<int> C1;A<auto> C2 = C1;  //错误return 0;
}

代码示例

我们再通过一个实际的例子来展示 auto 的使用。假设我们有一个函数,返回一个复杂的容器类型,我们可以使用 auto 来简化变量的声明。

#include <iostream>
#include <map>
#include <vector>std::map<std::string, std::vector<int>> complexFunction() {// 假设这个函数做了很多复杂的操作return {{"key", {1, 2, 3, 4, 5}}};
}int main() {auto result = complexFunction(); // 自动推导为std::map<std::string, std::vector<int>>for(auto& pair : result) {std::cout << pair.first << ": ";for(auto& elem : pair.second) {std::cout << elem << " ";}std::cout << std::endl;}
}
// 输出:key: 1 2 3 4 5 

关键字 auto 是 C++11 标准引入的一个强大特性,通过使用 auto,我们不仅能够使代码更加简洁,还可以减少因类型错误而引起的编译错误。这在处理复杂类型时尤其有用,可以大大提高编码效率和可读性。

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

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

相关文章

Linux命令:dmesg命令

目录 1 dmesg命令1.1 简介1.2 说明1.3 案例1、显示所有内核消息2、实时监控新消息3、显示特定级别的消息4、将消息输出到文件5、搜索包含特定字符串的被检测到的硬件6、将开机信息发邮件7、打印并清除内核环形缓冲区 总结 1 dmesg命令 1.1 简介 dmesg 命令在 Linux 系统中用于…

面试官:简单讲一下Spring Boot事务的使用

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:简单讲一下SpringBoot事务的使用 在Spring Boot中使用事务可以确保一系列操作要么全部成功要么全部失败,保持数据的一致性。Spring Boot提供了多…

Lord 3DMCV7-AHRS 时间同步硬件触发设置

目的:通过FPGA发送脉冲触发IMU采集数据。FPGA发送脉冲时,IMU才有数据产生。 FPGA与IMU的硬件接线就不讲了,这里主要说明的是IMU的设置以及ROS驱动的config文件更改。 1. WIN上位机设置 通过IMU在WINDOWS的上位机SensorConnect对IMU的GPIO、波特率等基本功能进行设值,具体…

通过spring boot/redis/aspect 防止表单重复提交【防抖】

一、啥是防抖 所谓防抖&#xff0c;一是防用户手抖&#xff0c;二是防网络抖动。在Web系统中&#xff0c;表单提交是一个非常常见的功能&#xff0c;如果不加控制&#xff0c;容易因为用户的误操作或网络延迟导致同一请求被发送多次&#xff0c;进而生成重复的数据记录。要针…

用pyecharts的overlap绘制叠加图时,设置的颜色不起作用

问题 用pyecharts绘制叠加图时&#xff0c;如折线图上叠加散点图时&#xff0c;分别设置了自己的颜色&#xff08;三角是绿色&#xff0c;圆形是蓝色&#xff09;&#xff0c;但是渲染颜色和图例颜色不一致&#xff0c;如下图所示&#xff0c;折线颜色和散点颜色相同。 解决…

【NestJS 编程艺术】1. NestJS设计模式深度解析:构建高效、可维护的服务端应用

在当今快速发展的软件开发领域&#xff0c;Node.js凭借其轻量级和高性能的特点&#xff0c;已经成为了构建服务端应用的首选技术之一。然而&#xff0c;随着应用规模的扩大&#xff0c;传统的Node.js框架如Express和Koa可能在架构设计和代码组织上显得力不从心。这时&#xff0…

vue3--事件处理

监听事件 Vue使用 v-on 指令 (通常缩写为 符号) 来监听 DOM 事件&#xff0c;并在触发事件时执行一些JS代码 比如 v-on:click“methodName” 或使用缩写方式 click“methodName” <divid"app"><buttonclick"counter 1">Add 1</button&g…

Leet code 904 水果成篮

解题思路&#xff1a;滑动窗口 创建hash表记录水果的种类和数量 两个指针left 和 right 从数组起始位置开始滑动&#xff0c;right在循环内 hash[fruits[right]] 进窗口 然后判断 hash表中的种类是否大于2 一旦大于2就要想办法出窗口 出窗口需要将hash表中种类重回2种 …

python做筛子用

import randomdef roll_dice():roll random.randint(1,10)return roll def main():total_times 100#初始化列表result_list[0]*10for i in range(total_times):print(roll_dice())for j in range(1,11):if roll_dice() j:result_list[j-1] 1if __name__ __main__:main() 结…

Js结束符与注释

JavaScript 注释有哪两种方式? 单行注释 //多行注释 /**/ JavaScript 结束符注意点 结束符是? 分号 结束符可以省略吗? Yes 但为了风格统一&#xff0c;经结束符要么每句都写&#xff0c;要么每句都不写&#xff08;团队约定&#xff09;

基于Java (spring-boot)的个人博客系统

一、项目介绍 登录模块&#xff1a;用户登录、用户注册 普通用户&#xff1a;博客主页、博客随笔、博客留言、个人信息修改 管理员&#xff1a;系统管理、内容管理、文章管理、随笔管理、分类管理、标签管理、留言管理、评论管理、文件管理 博客编辑&#xff1a;支持富文本编辑…

Autosar教程-Mcal教程-Fls配置教程

3.11.1 FLS基础知识 flash操作中有两个术语:block和page。block是flash最小的擦除单位,page则是flash写入的最小单位。以我们使用的F1KM-S4(R7F7016533)来说,它的是64 bytes, page是4bytes。这也就意味着,如果要擦除的话,最小要擦除64 bytes,但是写入可以按4字节的大小写入…

vue怎么跳转页面?

在 Vue.js 中&#xff0c;页面跳转通常是通过路由&#xff08;Vue Router&#xff09;来实现的。Vue Router 是 Vue.js 官方的路由管理器&#xff0c;可以实现单页应用&#xff08;SPA&#xff09;中的页面跳转、路由匹配和参数传递等功能。以下是几种常见的 Vue 页面跳转的方法…

程序员的知识宝库,100+开源书籍、文档

公众号&#xff1a;【可乐前端】&#xff0c;每天3分钟学习一个优秀的开源项目&#xff0c;分享web面试与实战知识&#xff0c;也有全栈交流学习摸鱼群&#xff0c;期待您的关注! 每天3分钟开源 hi&#xff0c;这里是每天3分钟开源&#xff0c;很高兴又跟大家见面了&#xff0…

每日五道java面试题之springMVC篇(四)

目录&#xff1a; 第一题. Spring MVC怎么样设定重定向和转发的&#xff1f;第二题.Spring MVC怎么和AJAX相互调用的&#xff1f;第三题. 如何解决POST请求中文乱码问题&#xff0c;GET的又如何处理呢&#xff1f;第四题. Spring MVC的异常处理&#xff1f;第五题. 如果在拦截请…

前端开发免费的常用(好用)网站合集,必看

前端学习交流QQ群&#xff1a;1群&#xff1a;173683895 &#xff0c;2群: 173683866 承接项目开发&#xff0c;需求功能开发&#xff0c;博主微信号&#xff1a;Jay_09168 1. 百度&#xff0c;作为CV工程师&#xff0c;百度还是用得最多的 https://www.baidu.com/ 2. 百度翻…

iOS面试题锦集

1. 问&#xff1a;一张图片所占内存大小跟什么有关&#xff1f; 图片所占内存大小&#xff0c;与图片的宽高有关 我们平时看到的png、jpg、webp这些图片格式&#xff0c;其实都是图片压缩格式。通过对应的算法来优化了大小以节省网络传输与本地保存所需的资源。 但是当我们加…

操作系统(一)

操作系统 一、操作系统的四个特性 并发性&#xff1a;并发性是指两个或多个时间在同一时间间隔发生&#xff0c;并发和并行是两个相似的概念&#xff0c;并行是指两个或多个事件在同一时刻发生。进程在宏观上并行&#xff0c;微观上串行 2.共享性&#xff1a;** 由于操作系统…

04-java基础--流程控制语句

一、switch语句 二、循环的三种结构 流程控制语句分为三种结构&#xff1a; 顺序结构&#xff08;按代码的书写顺序执行&#xff0c;从上到下依次执行&#xff09;分支结构&#xff08;if语句、if–else语句、switch语句&#xff09;循环结构&#xff08;while、for循环、do–…

H5 响应式精品网站推荐导航源码

源码名称&#xff1a;响应式精品网站推荐导航源码 源码介绍&#xff1a;一款响应式精品网站推荐导航源码&#xff0c;可以自己修改代码替换图标图片和指向网址。背景图支持自动替换&#xff0c;背景图可以在img.php中修改 需求环境&#xff1a;H5 下载地址&#xff1a; http…