当前位置: 首页 > news >正文

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

文章目录

      • 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为intauto& 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 };		// 推导为intauto 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>(); // 编译失败,模板参数不能为doublereturn 0;
}

http://www.mrgr.cn/news/60702.html

相关文章:

  • Unity 实现音频进度条(可控制)
  • hi3536上ffmpeg带rtmp移植
  • 例程学习(学习笔记)
  • Mac上面压缩文件出现__MACOSX文件夹问题
  • springboot配置websocket
  • centos8.5环境下openresty使用lua访问redis、本地缓存、获取get参数,请求头以及获取post body参数
  • C语言实现高并发编程——线程池
  • Open3D-Geometry-14:Distance Queries距离查询方法将网格生成为隐式表示
  • 【专题】关系模型的基本理论
  • 使用chatglm API处理论文
  • 排序算法简记
  • 五、Hadoop 分布式文件系统(HDFS)的原理与架构专业解析
  • python 数据结构 1
  • 一文贯通RAG的技术介绍和构建(简易版+附详细代码)
  • 2024年【制冷与空调设备安装修理】考试内容及制冷与空调设备安装修理最新解析
  • Java程序设计:spring boot(12)——定时调度集成 - Quartz
  • 怎么把照片恢复至手机?一文读懂详细教程与多种方法!
  • 从JDK 17 到 JDK 21:Java 新特性
  • 北理工计算机考研难度分析
  • ctfshow(151->154)--文件上传漏洞--.user.ini
  • 热门四款深度数据恢复软件大比拼!!!
  • 一个临床数据收集/调查问卷APP模板(streamlit+MongoDB)
  • rand5生成rand7
  • 代码随想录之字符串
  • Linux 进程间通信_匿名管道
  • IE快捷方式加载特定主页