auto占位符(C++11~C++17)

news2024/11/29 18:48:01

文章目录

      • 1. 定义
        • 1.1 注意事项
      • 2. 推导规则
      • 3. 返回类型推导(C++14)
      • 4. lambda表达式中使用auto类型推导
      • 5. 非类型模板形参占位符(C++17)

1. 定义

在C++11以前,auto关键字是用来声明自动变量的。从C++11起auto被用来:声明变量时根据初始化表达式自动推断该变量的类型、声明函数时函数返回值的占位符。

auto a = 5;			// 推断为int
auto b = "Hello";	// 推断为const char*

// 返回类型后置, auto为返回值占位符(主要用于函数模板的返回值推导)
auto fun(int x, int y) -> int
{
	return x + y;
}

auto占位符会让编译器去推导变量的类型。若编写的代码让编译器无法推导则会编译失败,例如:

auto a;	// 推导失败
a = 5;

编译器报错:
在这里插入图片描述
由此可知,在使用auto占位符声明变量时必须初始化变量。

1.1 注意事项
  1. 当用一个auto关键字声明多个变量时,编译器遵从由左往右的推导规则,以最左边的表达式推断auto类型。
int a = 5;
auto* p = &a, m = 10;	// auto被推断为int, 所以m为int
  1. 当使用条件表达式初始化auto声明的变量时,编译器总是使用表达能力更强的类型。
auto a = true ? 5 : 5.0;	// a被推断为double类型

通过反汇编查看可得
在这里插入图片描述

  1. 静态成员变量可以用auto声明并初始化,前提是auto必须用const限定符。
class CusType
{
	auto a = 0;					// 错误,无法通过编译
	static const auto b = 0;	// 正确
	static inline auto c = 0;	// C++17支持 (测试环境VS2019编译失败,linux g++可以)
};
  1. 在C++20之前,无法在函数形参列表中使用auto声明形参(在C++14中,auto可以为lambda表达式声明形参)。
int fun(auto a)		//  C++20之前编译失败,C++20编译成功 (测试VS2019编译失败)
{
	return a * 10;
}

auto 也可以和new关键字结合

auto p = new auto(5);

2. 推导规则

  1. 如果auto声明的变量是按值初始化,则推导出的类型会忽略cv限定符(即const和volatile)。
	const int a = 0;
	auto b = a;			// auto推导类型为int, b为int
	auto& c = a;		// auto推导类型为const int, c为const int&
	auto* d = &a;		// auto推到类型为const int, d为const int*
	const auto e = a;	// auto推导类型为int, e为const int
  1. 使用auto声明变量初始化时,目标对象如果是引用,则引用属性会被忽略。
	int a = 0;
	int& b = a;
	auto c = b;		// auto推导为int
  1. 使用auto和万能引用(&&)声明变量时,对于左值会将auto推导为引用类型。
	int a = 0;
	auto&& b = a;	// 推导为int&
	auto&& c = 1;	// 推导为int
  1. 使用auto声明变量,如果目标对象是一个数组或函数,则会被推导为对应的指针类型。
int fun(int x)
{
	return x * x;
}

int main()
{
	
	int a[8] = {0};
	auto b = a;		// 推导为int*
	auto c = fun;	// 推导为int(*)(int)

	return 0;
}
  1. 当auto与列表初始化组合时(C++17),①直接使用列表初始化,列表必须为单元素,auto推导为元素类型;②用等号加列表初始化,列表中可以包含单个或多个元素,auto被推导为std::initializer_list<T>,T为元素类型。
	auto a{ 1 };		// 推导为int
	auto b{ 1, 2, 3 };	// 编译失败,不是单个元素

	auto a = { 1 };		// 推导为std::initializer_list<int>
	auto b = { 1, 2.0 };// 编译失败,列表内元素类型不同
	auto c = { 1, 8 };	// 推导为std::initializer_list<int>

3. 返回类型推导(C++14)

auto sum(int x, int y)	// auto推导为int
{
	return x+y;
}

注意:如果有多个return,需保证返回值类型都相同才行。

4. lambda表达式中使用auto类型推导

	auto a = [](auto x, auto y)	// C++14,lambda形参用auto;
	{
		return x + y;
	};
	auto ret = a(14, 23.3);		// 返回值推导为double

lambda返回auto引用:

	auto fun = [](int& x) ->auto&
	{
		return x;
	};

	auto a = 1;
	auto& b = fun(a);
	assert(&a == &b);	// 有相同的内存地址

5. 非类型模板形参占位符(C++17)

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

int main()
{
	fun<5>();	// N为int类型
	fun<'c'>(); // N为char类型
	fun<5.2>(); // 编译失败,模板参数不能为double

	return 0;
}

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

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

相关文章

推荐收藏!一款超好用的网盘资源搜索工具

抖知书老师推荐&#xff1a; 盘搜问世以来&#xff0c;以其简洁、实用的设计&#xff0c;迅速成为网民心中的网盘资源搜索利器。对于那些日常生活离不开网盘的用户来说&#xff0c;盘搜的存在让他们的资源查找变得更加便捷和高效。从影视资源到课程资料再到个人文件&#xff0…

opencv - py_imgproc - py_filtering filtering 过滤-卷积平滑

文章目录 平滑图像目标2D 卷积&#xff08;图像过滤&#xff09;图像模糊&#xff08;图像平滑&#xff09;1. 平均2. 高斯模糊3. 中值模糊4. 双边滤波 其他资源 平滑图像 目标 学习&#xff1a; 使用各种低通滤波器模糊图像将定制滤波器应用于图像&#xff08;2D 卷积&…

MT1401-MT1410 码题集 (c 语言详解)

目录 MT1401归并排序 MT1402堆排序 MT1403后3位排序 MT1404小大大小排序 MT1405小大大小排序II MT1406数字重排 MT1407插入 MT1408插入 MT1409旋转数组 MT1410逆时针旋转数组 MT1401归并排序 c 语言实现代码 #include <stdio.h>// merge two subarrays void merge(int a…

大数据日志处理框架ELK方案

介绍应用场景大数据ELK日志框架安装部署 一&#xff0c;介绍 大数据日志处理框架ELK&#xff08;Elasticsearch、Logstash、Kibana&#xff09;是一套完整的日志集中处理方案&#xff0c;以下是对其的详细介绍&#xff1a; 一、Elasticsearch&#xff08;ES&#xff09; 基本…

PHP海外矿物矿机理财投资源码-金融理财投资源码

PHP海外矿物矿机理财投资源码/金融理财投资源码 海外矿物矿机理财投资源码 测试不错,可以做其他产品理财,功能都没啥太大问题

Unity3D学习FPS游戏(1)获取素材、快速了解三维模型素材(骨骼、网格、动画、Avatar、材质贴图)

前言&#xff1a;最近重拾Unity&#xff0c;准备做个3D的FPS小游戏&#xff0c;这里以官方FPS案例素材作为切入。 导入素材和素材理解 安装Unity新建项目新建文件夹和Scene如何去理解三维模型素材找到模型素材素材预制体结构骨骼和网格材质&#xff08;Material&#xff09;、…

php反序列化漏洞典型例题

1.靶场环境 ctfhub-技能树-pklovecloud 引用题目&#xff1a; 2021-第五空间智能安全大赛-Web-pklovecloud 2.过程 2.1源代码 启动靶场环境&#xff0c;访问靶场环境&#xff0c;显示源码&#xff1a;直接贴在下面&#xff1a; <?php include flag.php; class pks…

【flask】 flask redis的使用

目的&#xff1a;如何使用在flask web项目中连接redis&#xff0c;并简单的使用 使用的库包&#xff1a;flask-redis pip install falsk-redis下面的写法是对项目代码进行模块化拆分的写法&#xff0c;在app.py中只进行对象的初始化等操作&#xff1b;exts.py中创建对象&…

【含文档】基于ssm+jsp的房屋中介服务平台(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: apache tomcat 主要技术: Java,Spring,SpringMvc,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定义了两个…

CI/CD 的原理

一、CI/CD 的概念 CI/CD是一种软件开发流程&#xff0c;旨在通过自动化和持续的集成、测试和交付实现高质量的软件产品。 CI(Continuous Integration)持续集成 目前主流的开发方式是协同开发&#xff0c;即多位开发人员同事处理同意应用不同模块或功能。 如果企业在同一时间将…

网络请求自定义header导致跨域问题

我记得我的项目之前已经解决了跨域问题。 后来在功能开发着&#xff0c;需要添加一个自定义的header&#xff0c;发现又出现跨域报错。 于是又开始一通摸索折腾。 我的项目前面端是用axios网络请求&#xff0c;通过拦截器添加header&#xff0c;代码如下&#xff1a; //添加请…

python实战项目47:Selenium采集百度股市通数据

python实战项目47:Selenium采集百度股市通数据 一、思路分析二、完整代码一、思路分析 这里以获取百度股市通股评下的投票数据为例,页面中的其他数据同理。由于此页面数据是js动态加载的,所以采用Selenium获取数据。思路很简单,通过Selenium打开页面,然后定位到“股评”选…

《使用Gin框架构建分布式应用》阅读笔记:p212-p233

《用Gin框架构建分布式应用》学习第12天&#xff0c;p212-p233总结&#xff0c;总22页。 一、技术总结 1.JavaScript知识点 (1)class、method (2)function, arrow function, (3)fetch() (4)Promise, then() 2.bootstrap 第5章主要涉及前端技术的运用&#xff0c;作为后…

nfs作业

nfs作业 服务机&#xff1a; 编写配置文件&#xff1a; [rootlocalhost ~]# vim /etc/exports 配置文件内容&#xff1a; /nfs/shared *(ro,sync) /nfs/upload 192.168.36.0/24(rw,anonuid210,anongid210,sync) /home/tom 192.168.36.132(rw) 创建目录&#xff0c;文件&am…

紫杉醇的药物代谢-文献精读73

Hydrogen-Bond-Assisted Catalysis: Hydroxylation of Paclitaxel by Human CYP2C8 氢键辅助催化&#xff1a;人类CYP2C8对紫杉醇的羟基化 摘要 紫杉醇&#xff08;PTX&#xff0c;或称Taxol&#xff09;是一种广泛用于治疗多种癌症的化疗药物&#xff0c;经过细胞色素P450酶…

使用语言模型进行文本摘要的五个级别(llm)

视频链接&#xff1a;5 Levels Of LLM Summarizing: Novice to Expert

A Simple Semi-Supervised Learning Framework for Object Detection

1. Introduction SSL的成功主要有以下两个方面&#xff1a; &#xff08;1&#xff09;一致性正则化&#xff1a;如果对一个未标记的数据应用实际的扰动, 其预测结果不应该发生显著变化, 也就是输出具有一致性&#xff0c;通过在未标记数据上构造添加扰动后的预测结果 y~​ 与…

景区客流统计合理控制游客人数,预防意外发生

随着制造业的不断发展&#xff0c;工厂的管理和安全问题日益受到关注。为了提升生产效率和保障安全&#xff0c;许多工厂开始采用客流计数器系统。这种系统通过实时监测和控制车间内的人员数量&#xff0c;确保不超过安全规定&#xff0c;预防事故发生。本文将详细介绍工厂客流…

正则表达式以及密码匹配案例手机号码脱敏案例

目录 正则表达式 什么是正则表达式 语法 定义变量 test方法 exec方法 replace方法 match方法 修饰符 元字符 边界符 单词边界 字符串边界 边界符&#xff1a;^ 边界符&#xff1a;$ 量词 * ? {n} {n,} {n,m} 字符类 []匹配字符集合 .匹配除换行符之外的…

面向对象编程中类与类之间的关系(一)

目录 1.引言 2."有一个"关系 3."是一个"关系(继承) 4.“有一个”与“是一个”的区别 5.not-a关系 6.层次结构 7.多重继承 8.混入类 1.引言 作为程序员&#xff0c;必然会遇到这样的情况&#xff1a;不同的类具有共同的特征&#xff0c;至少看起来彼…