C++ auto

C++ auto

  • 一、C++ 11
    • 1.1 推导规则
    • 1.2 auto不能使用的场景
      • 1.2.1 auto 不能做为函数形参
      • 1.2.2 auto 不能声明数组
  • 二、C++ 14
    • 2.1 函数返回值类型推导
    • 2.2 lambda
  • 三、C++ 17
    • 3.1 非类型模版参数

前言:在早期C/C++中auto关键字的作用是:一个存储类型指示符,使用auto修饰的变量,存储类型为自动存储期,从变量声明处生命周期开始,出变量所在代码块生命周期结束,并且 全局变量不能用auto修饰。但是局部变量的生命周期本来就是进入作用域生命周期开始,出作用域生命周期结束。 导致用auto修饰局部变量和不使用auto修饰没有任何区别,处于一个尴尬地步。

一、C++ 11

 C++11中,标准委员会赋予了auto全新的作用:auto做为类型占位符auto声明的变量数据类型由编译器在编译时推导而得,所以使用auto声明变量时必须对其进行初始化,在编译阶段编译器根据初始化表达式来推导auto的实际类型。因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型

#include <iostream>

using namespace std;

int main()
{
	int x = 10;
	auto y = x; // 因为x为int类型,所以等同于 int y = x;
	auto a = 'a'; // 因为a为char类型,所以等同于 char a = 'a';
	auto b = 1; // 因为b为int类型,所以等同于 int b = 1;
	auto c = 3.14; // 因为c为double类型,所以等同于 double c = 3.14;
	// auto d; 错误,无法推导d是什么类型,导致不能分配内存空间
	cout << "y:" << typeid(y).name() << endl;
	cout << "a:" << typeid(a).name() << endl;
	cout << "b:" << typeid(b).name() << endl;
	cout << "c:" << typeid(c).name() << endl;
}

输出:

y:int
a:char
b:int
c:double

注意:使用auto对多个变量推导时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器按第一个变量类型进行推导,然后用推导出来的类型定义其他变量

auto a = 10, b = 20; // 正确
auto x = 1, y = 3.14; // 错误,第一个变量x类型为int,但y为double

1.1 推导规则

规则1: auto 会删除引用、const 限定符和 volatile 限定符

const int i = 1;
auto a = i; // auto推导类型为int,而不是const int

int j = 2;
int &ref = j;
auto b = ref; // ref为引用,auto推导会删除引用属性,auto推导类型为int,b类型为int
auto &c = ref; // ref为引用,auto推导类型为int,c类型为int&

规则2: auto推导指针类型时,autoauto*没有任何区别。

const int i = 1;

auto a = &i; // auto推导类型为const int*,a类型为const int*
auto* b = &i; // auto推导类型为const int,b类型为const int*

规则3: auto推导目标对象是数组或函数时,会被推导为对应指针类型

void fun() {
    std::cout << "test" << std::endl;
}

int arr[] = {1, 2, 3};

auto a = arr; // auto推导类型为int * 
auto b = fun; // auto推导类型为void (*)()

规则4 auto推导列表表达式

注意:下面规则适用于C++ 17

  • 直接使用列表初始化,列表中必须为单元素,否则编译错误,auto推导类型为该元素类型
  • 用等号加列表初始化,列表中可以包含多个类型相同的元素,auto推导类型为std::initializer_list<T>,其中T为元素类型
auto a1{3}; // auto推导类型为int
auto a2{1, 3}; // 编译错误,不是单个元素
auto a3 = {1, 2, 3}; // auto推导类型为std::initializer_list<int>
auto a4 = {1, 1.1}; // 编译错误,列表内元素类型不同

1.2 auto不能使用的场景

1.2.1 auto 不能做为函数形参

int add(auto x, auto y) // 错误,auto不能做函数形参,编译器不知道如何为形参分配空间
{
	return x + y;
}

1.2.2 auto 不能声明数组

auto arr[] = {123}; // 错误

二、C++ 14

2.1 函数返回值类型推导

C++ 14支持使用auto对函数返回值类型进行推导,但要确保所有的返回值类型是相同的。

auto add(int i,int j) // 正确
{
    return i+j;
}

auto add(double i,double j) // 错误,0为int类型,i+j为double类型,返回值类型不相同
{
	if(i < 0.0 || j < 0.0)
		return 0;
	else
		return i + j;
}

2.2 lambda

C++14支持在lambda中使用auto作为形参以及返回值类型推导。

auto f = [](auto x, auto y) // lambda中使用auto对函数形参类型推导
{
    return x + y;
};

auto ret1 = f(1, 2); // ret1 = 3
auto ret2 = f(1, 2.2); // ret2 = 3.2


auto f = [](auto &x) ->auto& // lambda可以使用auto推导返回值类型,或者auto&返回引用
{
    return x;
};

int x = 1;
cout << "&x:" << &x << endl;
auto& ref = f(x);
cout << "&ref:" << &ref << endl; // &x 与 &ref有相同地址

三、C++ 17

3.1 非类型模版参数

C++ 17支持auto作为非类型模版参数的占位符,但推导出来的类型必须是符合非类型模版参数类型要求的,否则编译会错误。

template <auto N>
void f()
{
    cout << N << endl;
}

f<1>(); // 正确
f<'a'>(); // 正确
f<3.14>(); // 错误,浮点类型不能作为非类型模版参数

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

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

相关文章

智慧校园:大数据助力校情分析

随着信息技术的快速发展&#xff0c;数据信息资源以井喷的姿态涌现。数据信息的大量涌现给人们带来丰富的数据信息资源&#xff0c;但面对海量的信息资源时&#xff0c;加大了人们对有效信息资源获取的难度&#xff0c;数据挖掘技术正是这一背景下的产物&#xff0c;基于数据挖…

【安卓13】解决带GMS编译报super分区空间不足错误

1、错误信息 2、解决方案 不同供应商修改分区大小的文件路径不一样&#xff0c;但是万变不离其宗&#xff0c;根据报错信息全局搜索关键词BOARD_SUPER_PARTITION_SIZE 这里以RK供应商和AML供应商修改为例&#xff1a; &#xff08;1&#xff09;RK改法&#xff1a; 根目录下…

2024深圳杯数学建模竞赛D题(东三省数学建模竞赛D题):建立非均质音板振动模型与参数识别模型

更新完整代码和成品完整论文 《2024深圳杯&东三省数学建模思路代码成品论文》↓↓↓&#xff08;浏览器打开&#xff09; https://www.yuque.com/u42168770/qv6z0d/zx70edxvbv7rheu7?singleDoc# 2024深圳杯数学建模竞赛D题&#xff08;东三省数学建模竞赛D题&#xff0…

构建高效智能的理赔业务系统:保险科技的未来

随着保险行业的发展和科技的不断进步&#xff0c;理赔业务作为保险服务的重要环节&#xff0c;也在不断演进和改进。传统的理赔流程可能存在效率低下、信息不透明等问题&#xff0c;而现代化的理赔业务系统则能够通过数字化、智能化等手段提升理赔服务的质量和效率&#xff0c;…

【机器学习】朴素贝叶斯解决实际问题

之前写过这样一道题&#xff1a; 现在换成使用朴素贝叶斯解决这个问题 首先先了解一下朴素贝叶斯 这是之前课本里的笔记记录&#xff1a; 【机器学习笔记】朴素贝叶斯&#xff08;从先验分布到后验分布&#xff09;-CSDN博客 简单的讲解一下这道题需要的知识点 朴素贝叶斯是…

【ensp】网关冗余vrrp实验

备战中级网络工程师 目录 vrrp&#xff08;虚拟路由冗余技术&#xff09; 为什么会出现vrrp&#xff1f; 两个角色 选举流程 基本原理 VRRP 的两个定时器 VRRP 的主备切换 主备切换的条件 VRRP 主备回切 认证方式 冗余路由器 冗余核心交换机 vrrp&#xff08;虚拟路…

【04-提升模型性能:集成学习与超参数优化】

文章目录 前言集成学习BaggingBoosting超参数优化随机搜索贝叶斯优化总结前言 在前几篇博文中,我们已经介绍了一些机器学习的基础知识、Scikit-learn的核心工具与技巧,以及如何评估模型性能。本篇博文将重点讲解两个可以显著提升机器学习模型性能的高级策略:集成学习和超参数…

Github 2024-04-25Go开源项目日报Top10

根据Github Trendings的统计,今日(2024-04-25统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10Vue项目1Go编程语言:构建简单、可靠和高效的软件 创建周期:3474 天开发语言:Go协议类型:BSD 3-Clause “New” or “Revised” Lic…

基于spark进行数据分析的心力衰竭可视化大屏项目

基于spark进行数据分析的心力衰竭可视化大屏项目 项目背景 在当今的医疗领域&#xff0c;数据驱动的决策变得日益重要。心力衰竭作为常见的心血管疾病&#xff0c;其临床数据的分析对于改善患者治疗结果至关重要。本文将介绍如何利用Apache Spark进行大规模心力衰竭临床数据的…

浅谈免杀下的持久化

文章目录 前记注册表计划任务COM劫持后记reference 前记 实战中持久化的手段常用的就是加服务、添改注册表、加计划任务、劫持等&#xff0c;这里探索c/c下的维权免杀 注册表 用户级 \HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run \HKEY_CURRENT_USER…

正则表达式.java

正则表达式的作用&#xff1a; ①可以校验字符串是否满足一定的规则&#xff0c;并用来校验数据格式的合法性&#x1f9f8; &#x1f9e9;[]:只能是括号里的字符 &#x1f9e9;[^]&#xff1a;除了括号里的字符 &#x1f9e9;[- -]:表示两段范围&#xff0c;满足其一即可 &a…

Linux系统内存持续飙高,如何排查

若一台服务器内存使用率持续处于高峰值&#xff0c;可能会导致响应慢&#xff08;如&#xff1a;ssh操作卡顿、用户访问失败或超时等&#xff09; 1.查看系统内存使用情况 free -m 2.查看哪些进程内存占用比较高 top 或htop 观察进程PID和命令确认是哪一个进程占用内存较高 …

Mogdb 5.0新特性:SQL PATCH绑定执行计划

前言 熟悉Oracle的dba都知道&#xff0c;生产系统出现性能问题时&#xff0c;往往是SQL走错了执行计划&#xff0c;紧急情况下&#xff0c;无法及时修改应用代码&#xff0c;dba可以采用多种方式针对于某类SQL进行执行计划绑定&#xff0c;比如SQL Profile、SPM、SQL Plan Base…

【prometheus】监控MySQL并实现可视化

目录 一、概述 1.1下载解压mysqld_exporter 1.2创建MySQL授权用户 1.3配置my.cnf 1.4启动mysqld_exporter 1.5prometheus配置修改 二、Grafana展示 【Prometheus】概念和工作原理介绍_prometheus工作原理 【Prometheus】k8s集群部署node-exporter 【prometheus】k8s集…

Python | Leetcode Python题解之第48题旋转图像

题目&#xff1a; 题解&#xff1a; class Solution:def rotate(self, matrix: List[List[int]]) -> None:n len(matrix)# 水平翻转for i in range(n // 2):for j in range(n):matrix[i][j], matrix[n - i - 1][j] matrix[n - i - 1][j], matrix[i][j]# 主对角线翻转for …

验证二叉搜索树 - LeetCode 热题 43

大家好&#xff01;我是曾续缘&#x1f618; 今天是《LeetCode 热题 100》系列 发车第 43 天 二叉树第 8 题 ❤️点赞 &#x1f44d; 收藏 ⭐再看&#xff0c;养成习惯 验证二叉搜索树 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜…

【Linux】什么是yum?--linux中的软件包管理器详解

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

UML——类图详解

目录 1. 前言 2. 类图概述 3. 类图表示法 3.1 类的表示方式 3.2 类与类之间关系的表示方式 (1)继承(泛化)关系 (2)实现关系 (3)依赖关系 (4)一般关联关系 (5)聚合关系 (6)组合关系 1. 前言 UML全称(Unified Modeling Language)&#xff0c;译为统一建模语言&#x…

FRPC+PHP+MYSQL+APACHE2=个人网站

应用背景有公网需求,但是又不想去买又贵又低配置的服务器,然后方案就应运而生 frp/README_zh.md at dev fatedier/frp (github.com) 在这里, FRPC作为内网穿透服务, PHPMYSQLAPACHE2,作为网站搭建,具体细节不细讲, 但是在我的/var/www/html下面 linaroHinlink:/var/www/h…

代码随想录算法训练营Day8 | ● 344.反转字符串● 541. 反转字符串II● 54.替换数字● 151.翻转字符串里的单词● 55.右旋转字符串

&#xff08;记得重学&#xff09; ● 344.反转字符串 题目&#xff1a;编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一…
最新文章