C++11 之 auto decltype
文章目录
- auto
- decltypes
- auto 和 decltype 的配合—返回值类型后置
关于 c++11 新特性,最先提到的肯定是类型推导,c++11 引入了 auto 和 decltype 关键字,使用他们可以在编译期就推导出变量或者表达式的类型,方便开发者编码也简化了代码。
auto
auto:让编译器在编译期间就推导出变量的类型,可以通过 = 右边的类型推导出变量的类型。
auto 关键字基本的使用语法如下:auto name = value;
示例:
auto a = 10; // 10 是 int 型,可以自动推导出 a 是 intint i = 10;
auto b = i; // b 是 int 型auto d = 2.0; // d 是 double 型auto url = "http://c.biancheng.net/cplus/"; // 由双引号包围起来的字符串是 const char* 类型,所以推导出变量 url 的类型是 const char*,也即一个常量指针。
auto 的限制:
- auto 的使用必须马上初始化,否则无法推导出类型;
- auto 在一行定义多个变量时,各个变量的推导不能产生二义性,否则编译失败;
- auto 不能用作函数参数;
- 在类中 auto 不能用作非静态成员变量;
- auto 不能定义数组,可以定义指针;
- auto 无法推导出模板参数。
示例:
int i = 10;
auto a = i, &b = i, *c = &i; // a是int,b是i的引用,c是i的指针,auto就相当于intauto d = 0, f = 1.0; // error,0和1.0类型不同,对于编译器有二义性,没法推导auto e; // error,使用auto必须马上初始化,否则无法推导类型void func(auto value) {} // error,auto不能用作函数参数class A {auto a = 1; // error,在类中 auto 不能用作非静态成员变量static auto b = 1; // error,这里与 auto 无关,正常 static int b = 1 也不可以,因为静态成员变量不能在类中初始化static const auto int c = 1; // ok
};void func2() {int a[10] = {0};auto b = a; // okauto c[10] = a; // error,auto不能定义数组,可以定义指针vector<int> d;vector<auto> f = d; // error,auto无法推导出模板参数
}
对引用的处理
当表达式的类型为引用时, auto 会抛弃引用类型,直接推导出它的原始类型。
int n = 10;
int& r1 = n;// auto推导
auto r2 = r1;
r2 = 20;
cout << n << ", " << r1 << ", " << r2 << endl;
// 打印结果:10, 10, 20
推导规则
首先,介绍下,这里的cv是指 cv 限定符,是 const 和 volatile 关键字的统称:
- const 关键字用来表示数据是只读的,也就是不能被修改;
- volatile 和 const 是相反的,它用来表示数据是可变的、易变的,目的是不让 CPU 将数据缓存到寄存器,而是从原始的内存中读取。
接着,看一下 auto 关键字对 cv 限定符的推导规则:
- 在不声明为引用或指针时,auto会忽略等号右边的引用类型和 cv 限定
- 在声明为引用或者指针时,auto会保留等号右边的引用和 cv 属性
int i = 0;
auto* a = &i; // a是int*
auto& b = i; // b是int&
auto c = b; // c是int,忽略了引用const auto d = i; // d是const int
auto e = d; // e是intconst auto& f = e; // f是const int&
auto& g = f; // g是const int&
什么时候使用 auto?
这里没有绝对答案,个人认为:在不影响代码可读性的前提下尽可能使用 auto 是合适的,复杂类型就使用 auto,但对于像 int、double 这种基础数据类型就没有必要使用 auto,看下面这段代码:
auto func = [&] {cout << "xxx";
}; // 对于 func 你难道不使用 auto 吗,反正我是不关心 lambda 表达式究竟是什么类型。auto asyncfunc = std::async(std::launch::async, func);
// 对于 asyncfunc 你难道不使用 auto 吗,我是懒得写 std::futurexxx 等代码,而且我也记不住它返回的究竟是什么...
decltypes
上面介绍 auto 用于推导变量类型,而 decltype 则用于推导表达式类型,这里只用于编译器分析表达式的类型,表达式实际不会进行运算,decltype 也是编译时期进行自动类型推导。
decltype 关键字基本的使用语法如下:decltype(exp) varname = value;
- exp 是表达式,decltype(exp) 和exp 类型相同
- exp 是函数调用,decltype(exp) 和函数返回值类型相同
- 其它情况,若 exp 是左值,decltype(exp) 是 exp 类型的左值引用
示例:
int func() { return 0; }
decltype(func()) i; // i为int类型int x = 0;
decltype(x) y; // y是int类型
decltype(x + y) z; // z是int类型int a = 0, b = 0;
decltype(a + b) c = 0; // c是int,因为(a+b)返回一个右值
decltype(a += b) d = c; // d是int&,因为(a+=b)返回一个左值
【注意1】decltype 不会像 auto 一样忽略引用和 cv 属性,decltype 会保留表达式的引用和 cv 属性:
cont int &i = 1;
decltype(i) b = 2; // b是const int&
【注意2】当表达式的类型为引用时,auto 和 decltype 的推导规则也不一样;decltype 会保留引用类型,而 auto 会抛弃引用类型,直接推导出它的原始类型。请看下面的例子:
int n = 10;
int& r1 = n;// auto推导
auto r2 = r1;
r2 = 20;
cout << n << ", " << r1 << ", " << r2 << endl;// decltype推导
decltype(r1) r3 = n;
r3 = 99;
cout << n << ", " << r1 << ", " << r3 << endl;
// 打印结果
// 10, 10, 20
// 99, 99, 99
【注意3】原则上讲,exp 就是一个普通的表达式,它可以是任意复杂的形式,但是我们必须要保证 exp 的结果是有类型的,不能是 void;例如,当 exp 调用一个返回值类型为 void 的函数时,exp 的结果也是 void 类型,此时就会导致编译错误。
只能使用 decltype 场景
auto 只能用于类的静态成员,不能用于类的非静态成员(普通成员),如果我们想推导非静态成员的类型,这个时候就必须使用 decltype 了。
#include <vector>
using namespace std;template <typename T>
class Base {
public:void func(T& container) { m_it = container.begin(); }private:decltype(T().begin()) m_it; //注意这里
};int main() {const vector<int> v;Base<const vector<int>> obj;obj.func(v);return 0;
}
auto 和 decltype 的配合—返回值类型后置
auto 和 decltype 一般配合使用在推导函数返回值的类型问题上。
下面这段代码:
template <typename T, typename U>
return_value add(T t, U u) { // t和v类型不确定,无法推导出return_value类型return t + u;
}
上面代码由于 t 和 u 类型不确定,那如何推导出返回值类型呢,我们可能会想到这种
template <typename T, typename U>
decltype(t + u) add(T t, U u) { // t和u尚未定义return t + u;
}
这段代码在 c++11 上是编译不过的,因为在 decltype(t +u) 推导时,t 和 u 尚未定义,就会编译出错,所以有了下面的叫做返回类型后置的配合使用方法:
template <typename T, typename U>
auto add(T t, U u) -> decltype(t + u) {return t + u;
}
返回值后置类型语法通过 auto 和 decltype 结合起来使用,目的为了解决函数返回值类型依赖于参数但却难以确定返回值类型的问题。
相关文章:
C++11 之 auto decltype
文章目录autodecltypesauto 和 decltype 的配合—返回值类型后置关于 c11 新特性,最先提到的肯定是类型推导,c11 引入了 auto 和 decltype 关键字,使用他们可以在编译期就推导出变量或者表达式的类型,方便开发者编码也简化了代码。…...
论文笔记:How transferable are features in deep neural networks? 2014年NIP文章
文章目录一、背景介绍二、方法介绍三、实验论证四、结论五、感想参考文献一、背景介绍 1.问题介绍: 许多在自然图像上训练的深度神经网络都表现出一个奇怪的共同现象:在第一层,它们学习类似于Gabor过滤器和color blobs的特征。这样的第一层特…...
python基于flask共享单车系统vue
可定制框架:ssm/Springboot/vue/python/PHP/小程序/安卓均可开发 目录 1 绪论 1 1.1课题背景 1 1.2课题研究现状 1 1.3初步设计方法与实施方案 2 1.4本文研究内容 2 2 系统开发环境 4 2. 3 系统分析 6 3.1系统可行性分析 6 3.1.1经济可行性 6 3.1.2技术可行性 6 3.1.3运行可行…...
C++11 之模板改进
模板的右尖括号 在 c98/03 的泛型编程中,模板实例化有一个很烦琐的地方,那就是连续两个右尖括号(>>)会被编译器解释成右移操作符,而不是模板参数表的结束,所以需要中间加个空格进行分割,…...
Linux - POSIX信号量,基于环形队列的生产者消费者模型
信号量在Linux下,POSIX信号量是一种线程同步机制,用于控制多个线程之间的访问顺序。POSIX信号量可以用于实现线程之间的互斥或者同步。在之前的阻塞队列生产者消费者模型中,阻塞队列是一个共享资源,不管是生产者还是消费者&#x…...
学习Flask之七、大型应用架构
学习Flask之七、大型应用架构 尽管存放在单一脚本的小型网络应用很方便,但是这种应用不能很好的放大。随着应用变得复杂,维护一个大的源文件会出现问题。不像别的网络应用,Flask没有强制的大型项目组织结构。构建应用的方法完全留给开发者。…...
CentOS9下编译FFMPEG源码
克隆...
炼石:八年饮冰难凉热血,初心如磐百炼成钢
炼石成立八周年 八载笃行,踔厉奋发。创立于2015年的炼石,今天迎来了八岁生日,全体员工共同举行了温暖又充满仪式感的周年庆典。过去的2022,是三年疫情的艰难“收官之年”,新的2023,将是数据安全行业成为独…...
Python基本数据类型
Python有六种基本数据类型Number(数字)String(字符串) List(列表) Tuple(元组) Set(集合)Dictionary(字典)String(字符串&…...
【MySQL进阶】 锁
😊😊作者简介😊😊 : 大家好,我是南瓜籽,一个在校大二学生,我将会持续分享Java相关知识。 🎉🎉个人主页🎉🎉 : 南瓜籽的主页…...
javascript高级程序设计第四版读书笔记-第五章 基本引用类型
19.如何创建一个指定的本地时间? Dete只能接收时间戳,有两种方法可以将字符串参数变为时间戳,他们是Date隐式调用的, 分别是Date.parse() 创建的是GTM时间,Date.UTC()创建的是本地时间 Date.UTC()方法也返回日期的毫秒表示&#x…...
《爆肝整理》保姆级系列教程python接口自动化(二十一)--unittest简介(详解)
简介 前边的随笔主要介绍的requests模块的有关知识个内容,接下来看一下python的单元测试框架unittest。熟悉 或者了解java 的小伙伴应该都清楚常见的单元测试框架 Junit 和 TestNG,这个招聘的需求上也是经常见到的。python 里面也有单元 测试框架-unitt…...
【C++的OpenCV】第四课-OpenCV图像常用操作(一):Mat对象深化学习、灰度、ROI
我们开始图像处理的基本操作的了解一、图像对象本身的加深学习1.1 Mat对象和ROI1.1.1 创建一个明确的Mat对象1.1.2 感兴趣的区域ROI二、图像的灰度处理2.1 概念2.2 cvtColor()函数2.3 示例一、图像对象本身的加深学习 1.1 Mat对象和ROI 这是一个技术经验的浅尝,所以…...
Propargyl-PEG1-SS-PEG1-PFP ester,1817735-30-0,炔基应用于生物标记
【中文名称】丙炔-单乙二醇-二硫键-单乙二醇-五氟苯酚酯【英文名称】 Propargyl-PEG1-SS-PEG1-PFP ester【结 构 式】【CAS号】1817735-30-0【分子式】C16H15F5O4S2【分子量】430.4【基团部分】炔基基团【纯度标准】95%【包装规格】1g,5g,10g,…...
产品运营︱用户活跃度低的解决方法
app用户活跃度低,产品拉新变现效率慢,这是运营app时难免会遇到的情况。要想解决这类问题,就要从可能的原因下手,进行产品的优化改进,记录下改变后的关键数据变化,定期做好复盘工作进行调整。 一、app用户量…...
【华为OD机试模拟题】用 C++ 实现 - 求最大数字
最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…...
吉卜力风格水彩画怎么画?
著名的水彩艺术家陈坚曾说:“水彩是用水润调和形成的饱和度极高的艺术画面,在纸上晕染的画面面积、强度等具有许多随意性,天空的颜色乌云密布,都是很随意的,难以模仿。” 是的,水彩画的妙处就在于不确定的…...
Python的类变量和对象变量声明解析
Python的类变量和对象变量声明解析 原文链接:https://www.cnblogs.com/bwangel23/p/4330268.html Python的类和C一样,也都是存在两种类型的变量,类变量和对象变量!前者由类拥有,被所有对象共享,后者由每个…...
#笨鸟先飞 猴博士电路笔记 第一篇 电路基础
第零课 基础知识串联与并联电源电势与电位差第一课 电阻电路的等效变换电压源串联电流源并联电压源和电流源串联电压源和电流源并联电压源转化为电流源电流源转化为电压源Δ-Y等效变换第二课 基尔霍夫定律基尔霍夫电流定律任一结点上流出电流之和等于流入电流之和。受控电流源&…...
快捷式~node.js环境搭建
1、安装包官网下载:Node.js (nodejs.org) 2、安装完成后修改环境变量 在上面已经完成了 node.js 的安装,即使不进行此步骤的环境变量配置也不影响node.js的使用 但是,若不进行环境变量配置,那么在使用命令安装 node.js全局模块 …...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
