109 C++ 理解auto 类型推断,auto 应用场合

一。auto 类型推断

auto 用于变量的自动推断,原理是--在声明变量的时候,根据变量的初始值的类型,自动为此变量选择匹配的类型,而不需要我们显示指定类型


特点:1.auto 的类型推断是发生在编译期间的,所以不会影响程序执行期间的性能。
特点:2.auto 在编译期间就知道了类型,因此 auto 后面的变量需要立刻初始化。这样编译器才能推断它的实际类型。
            //那么编译的时候才能确定 auto 的类型和整个变量的类型。 
            //因此auto 是有类型的,(可以对照理解 参数模版 T ,参数模版T也是有类型的。)
            //然后 在编译期间就可以用真正的类型替换掉auto这个类型占位符了。
特点:3.auto的使用灵活,和指针,引用,const 等 限定符 结合使用。
特点:4.auto 的类型推断 和 函数模版的推断是 非常相似的。因此我们在理解的时候可以结合着函数模版中的 参数T,来对照理解 auto。也可以说 auto 这个东西也是类型声明的一部分。

auto & a;

    //总结一:传值方式的auto ,会抛弃引用,抛弃const 等限定符
    //总结二:引用传递的auto,引用会被抛弃,const 会被保留。

	using boost::typeindex::type_id_with_cvr;//之前我们在学习函数模版的时候,将函数模版中的参数分为3类。//a 指针或者引用类型但是不是万能引用//b 万能引用//c 传值方式(非指针,非引用)//在auto 的学习过程中,会参考这3类学习//c传值方式auto x = 27;// x= int,   auto =intconst auto x2 = x;//x2 = const int,   auto = int// a 指针或者引用类型 但不是 万能引用。 auto 后面直接加 &,就是引用类型。const auto &xy = x2;//xy = const int & ,  auto = intcout << "xy = " << type_id_with_cvr<decltype(xy)>().pretty_name() << endl; //结果是intauto xy2 = xy; //xy2= int, auto = int;//注意这里,auto xy2 = xy 属于传值方式,引用类型会被抛弃,const 属性会被抛弃,把对方看成一个新副本。cout << "xy2 = " << type_id_with_cvr<decltype(xy2)>().pretty_name() << endl; //结果是int//总结一:传值方式的auto ,会抛弃引用,抛弃const 等限定符//总结二:引用传递的auto,引用会被抛弃,const 会被保留。auto &xy3 = xy;//引用传递 先前 xy = const int &,引用传递会抛弃 引用,因此xy3 = const int &, auto = const intauto y = new auto(100); //auto = int *, y = int *const auto *xp = &x;//先前 x= int, auto = int,xp = const int *auto *xp2 = &x;//先前 x= int, auto = int,xp2 =  int *auto xp3 = &x;//先前 x= int, auto = int *,xp3 =  int *   xp3没有声明为指针,但auto也把它推导成了指针类型

    //总结三, 万能引用
    auto && wnyy1 = x;//x是左值,auto = int&, wnyy1 = int&
    auto && wnyy2 = x2;//先前 x2 = const int,x2是左值,auto = int &,wnyy2 = const int &
    auto && wnyy3 = 100;//auto = int, wnyy3 = int &&

二。auto 类型对于数组和函数的推断

如果是值传递,数组会退化成指针。

如果是值传递,但是用引用接,数组就变成了 数组的引用 const char (&) [14];

const char mystr[] = "I Love china!" //mystr = const char[14];

auto myarr = mystr;//  auto = const char *    ,,   myarr = const char *

auto &myarr2 = mystr;    // myarr2 = const char (&) [14];

如果是函数

auto tempfunc = myfun3;// void(*)(double , int)//函数指针

auto &tempfunc2 = myfun3;// void(&)(double , int)//函数引用

三,auto 类型std::initializer_list的特殊推断

我们先来看,一个普通整型的定义和赋值

int x =10;

int x1(20);

int x2{30};

int x3 = {40};

如果换成auto 呢?

auto x =10;

auto x1(20);

auto x2{30};

auto x3 = {40};

然后打印x,x1,x2,x3的类型

会发现, x,x1,x2都是int

只有x3的类型是 std::initializer_list

那么这个initializer_list 是啥呢?initializer_list是C++11引入的新类型(类模版),表示某种特定的值的数组。

因此 auto x5 的写法会有build error

模版参数中是 initializer_list 以及调用方式

template <class T>
void fautofun(std::initializer_list<T> param) {}void main() {auto x = 10;auto x1(20);auto x2{ 30 };auto x3 = { 40 };using boost::typeindex::type_id_with_cvr;cout << "x = " << type_id_with_cvr<decltype(x)>().pretty_name() << endl; //结果是intcout << "x1 = " << type_id_with_cvr<decltype(x1)>().pretty_name() << endl; //结果是intcout << "x2 = " << type_id_with_cvr<decltype(x2)>().pretty_name() << endl; //结果是intcout << "x3 = " << type_id_with_cvr<decltype(x3)>().pretty_name() << endl; //结果是int//  x = int//	x1 = int//	x2 = int//	x3 = class std::initializer_list<int>auto x4 = { 50,60 };cout << "x4 = " << type_id_with_cvr<decltype(x4)>().pretty_name() << endl; //结果是int//x4 = class std::initializer_list<int>//auto x5 = { 50,60,89.8 };//build error,提示:无法推导“auto”类型//这样调用fautofun({ 12 });
}

四,   auto 不使用的场合举例

1.auto不能用于函数参数,比如void myfun(auto x, int y);

2.类内中的 普通成员变量不可以是 auto 类型

3.类内的静态成员变量 可以是auto类型,但是要在类内初始化  static const auto m_si = 15;//被允许

五。auto 适用场合举例

简化代码。

void main() {map<string, int> mymap = { {"wang",6},{"lisi",90} };mymap.insert(make_pair("nihao",23));map<string, int>::iterator iter;for (iter = mymap.begin(); iter != mymap.end(); ++iter){cout << (*iter).first << "  =  " << (*iter).second << endl;}cout << " fengexian" << endl;for (auto iter = mymap.begin(); iter != mymap.end(); ++iter) {cout << (*iter).first << "  =  " << (*iter).second << endl;}
}

不确定类型时的应用。

class Teacher20 {
public:static int statictestfunc() {cout << "Teacher20 statictestfunc" << endl;return 0;}
};class Teacher21 {
public:static double statictestfunc() {cout << "Teacher21 statictestfunc" << endl;return 100.8f;}
};
template <class T>
auto func61() {auto res =  T::statictestfunc();return res;
}void main() {func61<Teacher20>();func61<Teacher21>();
}

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

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

相关文章

java 调用智谱ai 大模型的完整步骤(国内的 AI 大模型 对话)

要使用java 调用智谱AI的API进行异步调用&#xff0c;您需要遵循以下步骤&#xff1a; 1. **获取API密钥**&#xff1a; - 您需要从智谱AI平台获取一个API密钥&#xff08;API Key&#xff09;&#xff0c;这个密钥将用于所有API请求的身份验证。 2. **SDK源…

【MySQL/Redis】如何实现缓存一致

目录 不实用的方案 1. 先写 MySQL , 再写 Redis 2. 先写 Redis &#xff0c; 再写MySQL 3. 先删 Redis&#xff0c;再写 MySQL 实用的方案 1. 先删 Redis&#xff0c;再写 MySQL, 再删 Redis 2. 先写 MySQL , 再删 Redis 3. 先写MySQL&#xff0c;通过BinLog&#xff0…

傅里叶变换(Fourier Transform)简介

目录 1.什么是傅里叶变换2.应用场景开源的语音识别软件1.什么是傅里叶变换 傅里叶变换(Fourier Transform)是一种在数学、物理和工程等领域中广泛使用的数学变换。它是信号处理中的基础工具,用于将一个函数或信号从时域(或空间域)转换到频域。 傅里叶变换的基本思想是,…

ClickHouse--10--临时表、视图、向表中导入导出数据

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.临时表1.1 特征1.2 创建一个临时表 2.视图2.1 普通视图2.2 物化视图 3.向表中导入导出数据3.1 案例 1.临时表 1.1 特征 ClickHouse 支持临时表&#xff0c;临时表…

智能汽车行业产业研究报告:毫米波雷达优势明显,核心壁垒是芯片、天线阵列、波形设计

今天分享的是智能汽车系列深度研究报告&#xff1a;《智能汽车行业产业研究报告&#xff1a;毫米波雷达优势明显&#xff0c;核心壁垒是芯片、天线阵列、波形设计》。 &#xff08;报告出品方&#xff1a;国泰君安证券&#xff09; 报告共计&#xff1a;67页 毫米波雷达被广泛…

Flume(二)【Flume 进阶使用】

前言 学数仓的时候发现 flume 落了一点&#xff0c;赶紧补齐。 1、Flume 事务 Source 在往 Channel 发送数据之前会开启一个 Put 事务&#xff1a; doPut&#xff1a;将批量数据写入临时缓冲区 putList&#xff08;当 source 中的数据达到 batchsize 或者 超过特定的时间就会…

【前端web入门第六天】01 CSS浮动

⭐️第六天目标 解决布局问题如多个div标签在同一行的问题 简单来说,就是可以两个标签,一个在左边,另一个在右边. &#x1f449;相关知识 标准流浮动flex布局❗️ ❗️ ❗️ 标准流是先导,浮动和flex布局都可以解决问题,但是浮动在目标开发领域较为落后,主流的解决办法是flex…

OpenCV Mat实例详解 一

OpenCV中的Mat是一个类&#xff0c;它用存储图像信息。由两部分数据组成&#xff1a;矩阵头和像素值矩阵。矩阵头包含矩阵尺寸、存储方法、存储地址等信息&#xff0c;而像素值矩阵则存储实际的像素值数据。 Mat类在OpenCV中有十分重要的作用&#xff0c;图像信息的载入、保存、…

Java 中 一些常见的并发集合类

什么是并发集合&#xff1f;列举一些常见的并发集合类 并发集合是一种特殊的数据结构&#xff0c;它允许多个线程安全地访问和修改。在多线程编程的场景下&#xff0c;只有使用并发集合才能确保线程安全&#xff0c;避免多个线程在对同一个数据结构进行并发操作时引发的竞态条…

UI设计常见风格(1):一文读懂九个,教你如何辨识。

Hello&#xff0c;我是大千UI工场&#xff0c;设计风格是我们新开辟的栏目&#xff0c;上次讲了毛玻璃风格、辨识方法、应用场景、运用方法等&#xff0c;很受大家欢迎&#xff0c;本次带来常见的风格及辨识&#xff0c;让大家有个总览&#xff0c;以后会逐个讲解的&#xff0c…

【Java】零基础蓝桥杯算法学习——动态规划例题

例题&#xff1a;2023年第十四届蓝桥杯Java软件开发B组E题 蜗牛 参考解答&#xff1a; 参考代码示例&#xff1a; import java.util.Scanner; public class Main {static int N 100010;static int[] arr new int[N];static int[] a new int[N]; //传送带的起始坐标static …

人工智能之数学基础【最小二乘法】

原理 最小二乘法由勒让德(A.M.Legendre)于1805年在其著作《计算彗星轨道的新方法》中提出,主要思想是最小化误差二次方和寻找数据的最佳匹配函数,利用最小二乘法求解未知参数,使得理论值与观测值之差(即误差,或称为残差)的二次方和达到最小,即: E = ∑ i = 1 n ϵ …

【实战】一、Jest 前端自动化测试框架基础入门(一) —— 前端要学的测试课 从Jest入门到TDD BDD双实战(一)

文章目录 一、前端要学的测试课1.前端要学的测试2.前端工程化的一部分3.前端自动化测试的例子4.前端为什么需要自动化测试&#xff1f;5.课程涵盖内容6.前置技能7.学习收获 二、Jest 前端自动化测试框架基础入门1. 自动化测试背景及原理前端自动化测试产生的背景及原理 2.前端自…

开什么店最稳定轻松?适合一个人开的实体店推荐

在创业的道路上&#xff0c;很多人都希望找到一种稳定轻松的开店方式。 作为一名资深的鲜奶吧创业者&#xff0c;我将分享我的经验和见解&#xff0c;希望能给那些想开实体店的朋友们一些启示&#xff01;&#xff01; 我开鲜奶吧已经有 5 年时间了&#xff0c;目前经营的是鲜…

MySQL查询状态

MySQL查询状态 在一个查询周期中&#xff0c;MySQL任何时刻都有一个状态&#xff0c;该状态可能会变化很多次&#xff0c;可以使用show full processlist来进行查看 Sleep 线程正在等待客户端发送新的请求 Query 线程正在执行查询或者正在将结果发送给客户端 Locked 该线程正在…

MIT-BEVFusion系列八--onnx导出1 综述及相机网络导出

目录 综述export-camera.py加载模型加载数据生成需要导出成 onnx 的模块Backbone 模块VTransform 模块 生成 onnx使用 pytorch 原生的伪量化计算方法导出 camera.backbone.onnx导出 camera.vtransform.onnx 综述 bevfusion的各个部分的实现有着鲜明的特点&#xff0c;并且相互…

Harris关键点检测以及SAC-IA粗配准

一、Harris关键点检测 C #include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/common/io.h> #include <pcl/keypoints/harris_3d.h> #include <pcl/visualization/pcl_visualizer.h> #include …

摸索设计模式的魅力:从策略模式看软件设计的智慧-灵活应对变化的艺术

设计模式专栏&#xff1a;http://t.csdnimg.cn/U54zu 目录 一、案例场景1.1 一坨坨代码实现1.2 存在的问题 二、使用策略模式解决问题2.1 使用策略模式重构代码2.2 克服了问题 三、模式讲解3.1 结构图及说明3.2 实现步骤和注意事项3.3 适用场景 四、优势和局限性4.1 优势4.2 局…

JSP原理简述

JSP动态网页技术&#xff0c;可以定义html&#xff0c;css&#xff0c;js等静态内容&#xff0c;还可以定义java代码等动态内容。 注意导入坐标时&#xff0c;JSP的scope标签是provided&#xff0c;和servlet一样&#xff0c;否则会报错。 JSP本质上就是一个Servlet&#xff0c…

TestNG invocationCount属性

有时我们会遇到这样的问题&#xff0c;比如如何多次运行一个测试用例&#xff1f;invocationCount是这个问题的答案。在这篇文章中&#xff0c;我们将讨论在TestNG中与Test annotation一起使用的invocationCount属性。 这个属性有什么作用&#xff0c;或者调用计数有什么用&am…