C++自动类型推导 : auto 与 decltype 用法

基本用法与区别

auto 总是推导出“值类型”,绝不会是“引用”,如果有引用,auto会把引用去掉,推导出值类型; auto 可以附加上 const、volatile、*、& 这样的类型修饰符,得到新的类型。

auto x = 10L; // auto推导为long,x是long
auto& x1 = x; // auto推导为long,x1是long&
auto* x2 = &x; // auto推导为long,x2是long*
const auto& x3 = x; // auto推导为long,x3是const long&
auto x4 = &x3; // auto推导为const long*,x4是const long*

auto 只能用于“初始化 “, “自动类型推导”要求必须从表达式推导,那在没有表达式的时候

就需要使用decltype + 表达式,自己解决类型推导问题。

decltype 的形式很像函数,后面的圆括号里就是可用于计算类型的表达式(和 sizeof 有点 类似),其他方面就和 auto 一样了,也能加上 const、*、& 来修饰 ,它是用来直接声明变量的。

int x = 0; // 整型变量
decltype(x) x1; // 推导为int,x1是int
decltype(x)& x2 = x; // 推导为int,x2是int&,引用必须赋值
decltype(x)* x3; // 推导为int,x3是int*
decltype(&x) x4; // 推导为int*,x4是int*
decltype(&x)* x5; // 推导为int*,x5是int**
decltype(x2) x6 = x2; // 推导为int&,x6是int&,引用必须赋值

decltype 不仅能够推导出值类型,还能够推导出引用类型,也就是表达式的“原始类 型”。

delctype的缺点是 是写起来略麻烦,特别在用于初始化的时候,表达式要重复两次 (左边的类型计算,右边的初始化)

当decltype(auto)被用于声明变量时,该变量必须立即初始化。假设该变量的初始化表达式为e,那么该变量的类型将被推导为decltype(e)。也就是说在推导变量类型时,先用初始化表达式替换decltype(auto)当中的auto,然后再根据decltype的语法规则来确定变量的类型。

int x = 0; // 整型变量
decltype(auto) x2 = &x; // 推导为int*
decltype(auto) x3 = x1; // 推导为int&

常见用法

auto的 range-based for 用法

不需要关心容器元素类型、迭 代器返回值和首末位置,就能非常轻松地完成遍历操作

vector<int> v = {2,3,5,7,11}; // vector顺序容器
for(const auto& i : v) { // 常引用方式访问元素,避免拷贝代价cout << i << ","; // 常引用不会改变元素的值
}
for(auto& i : v) { // 引用方式访问元素i++; // 可以改变元素的值cout << i << ",";
}

decltype 简化函数指针

// UNIX信号函数的原型,看着就让人晕
void (*signal(int signo, void (*func)(int)))(int)
// 使用decltype可以轻松得到函数指针类型
using sig_func_ptr_t = decltype(&signal) ;

decltype在类内部实现参数推导

在定义类的时候,auto 被禁用了。可以用decltype获取表达式类型,配合using生成别名

class DemoClass final {
public:using set_type = std::set<int>; // 集合类型别名
private:set_type m_set; // 使用别名定义成员变量// 使用decltype计算表达式的类型,定义别名using iter_type = decltype(m_set.begin());iter_type m_pos; // 类型别名定义成员变量
};

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

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

相关文章

C++智能指针使用指南 part1:基本使用

加粗样式>TOC 智能指针是代理模式的具体应用&#xff0c;它使用 RAII 技术代理了裸指针&#xff0c;能够自动释放内存&#xff0c; 无需程序员干预&#xff0c;所以被称为“智能指针”。 智能指针不是指针&#xff0c;而是一个对象&#xff0c;所以不要对其调用delete&…

AS3.0 BitmapData类介绍

注&#xff1a;文中的Bitmapdata和BMD均为同一意思BitmapData,BMD为其缩写一&#xff0c;概括&#xff1a; Bitmapdata继承Object对象&#xff0c;实现IBitmapDrawable接口&#xff0c;这个接口有什么用&#xff0c;你可以理解为Drawable,能被画。官方介绍是&#xff1a;IBitma…

C++使用JSON的序列化与反序列化

这里使用的json解析工具为JSON for Modern C,使用的话仅需要包含头文件。 获取方式&#xff1a;wget https://github.com/nlohmann/json/releases/download/v3.7.3/json.hpp JSON json的序列化功能和map一样&#xff0c;用关联数组的"[]"来任意添加数据&#xff0c…

iOS判断为空或者只为空格

本文转载至 &#xff1a;http://www.cnblogs.com/superhappy/archive/2012/11/08/2761403.html 经常有需求 要判断不能为空&#xff0c;后台老是鄙视不做非空判断的前端 &#xff0c;木办法 只能写一个。 第一种想法&#xff1a;我不就是判断 是不是nil就可以了么。结果发现太天…

Hyper-V

Hyper-V&#xff1a;也就是虚拟化技术&#xff0c;允许终端用户在同一台机器上运行多个操作系统&#xff0c;支持32位和64位系统&#xff0c;可以直接在Windows 8上创建自己的虚拟机。开启Hyper-V虚拟机需要更多的内存&#xff0c;正常运行需要至少4GB以上内存&#xff0c;所以…

sdut 1451 括号东东 DP

http://acm.sdut.edu.cn/sdutoj/problem.php?actionshowproblem&problemid1451 题意&#xff1a;中文..... 思路&#xff1a; pku有一道题&#xff0c;经典的括号匹配&#xff08;区间DP&#xff09;题目&#xff0c;那道题目是求的最长满足条件的子串的长度&#xff0c;那…

CDN缓存替代算法

CDN缓存工作过程如下&#xff1a;用户发出一个请求&#xff0c;如果请求被命中&#xff0c;缓存将对用户的请求进行响应&#xff0c;返回其请求的数据&#xff1b;如果未被命中&#xff0c;缓存向上拉取用户需要的数据&#xff0c;并对其存储的数据进行替换。 缓存算法的意义在…

前端开发常用正则表达式

1、电话 var phone /(^[^1][0-9\-]{6,20}$)|(^(134|135|136|137|138|139|150|151|152|157|158|159|182|183|187|188|147|130|131|132|155|156|185|186|145|133|153|180|189|181|184)\d{8}$)/ 2、邮箱 var email /^([a-zA-Z0-9_.-])([a-zA-Z0-9_-])((\.[a-zA-Z0-9_-]{2,3}){1,…

android 中调用接口发送短信

转载&#xff1a;http://ziyu-1.iteye.com/blog/1013932 android中可以通过两种方式发送短信 第一&#xff1a;调用系统短信接口直接发送短信&#xff1b;主要代码如下&#xff1a; Java代码//直接调用短信接口发短信 SmsManager smsManager SmsManager.getDefault(); List…

linux 命令案例学习——文件搜索

两个搜索文件的工具 locate ——仅仅通过文件名查找文件find ——依据文件的各种属性在既定目录&#xff08;包括子目录&#xff09;里查找一个通常与文件搜索命令一起使用、处理搜索结果文件列表的命令 xargs1 locate 1.1 查找文件名中含有zip的文件名 locate zip 看下结…

Redis 缓存击穿、缓存穿透、缓存雪崩的处理方法

常用的分布式缓存Redis单机并发量能达到万级&#xff0c;常用的关系型数据库MySQL一般并发量是千级&#xff0c;他们支持的并发量可能差十倍&#xff0c;所以要尽可能把流量拦截在缓存层。 缓存击穿 一个并发访问量比较大的key在某个时间过期&#xff0c;导致所有的请求直接打…

Java-- 异常与记录日志

可以使用java.util.logging工具将输出记录在日志中。记录日志的的功能还是很简单的&#xff0c;下面直接铺出代码&#xff1a; 1 package com.exceptions;2 3 import java.io.*;4 import java.util.logging.Logger;5 6 class LoggingException extends Exception{7 private…

图像处理基础

图像处理基础 在计算机中&#xff0c;按照颜色和灰度的多少可以将图像分为二值图像、灰度图像、索引图像和真彩色RGB图像四种基本类型。目前&#xff0c;大多数图像处理软件都支持这四种类型的图像。 (1) 二值图像&#xff1a;一幅二值图像的二维矩阵仅由0、1两个值构成&#x…

缓存一致性解决方法

对于缓存 数据库读写&#xff0c;有个经典的Cache Aside Pattern&#xff1a; 读取&#xff1a;先读取缓存&#xff0c;缓存里没有&#xff0c;读取数据库&#xff0c;然后返回响应&#xff0c;顺便保存缓存&#xff1a; 更新&#xff1a;先更新数据库&#xff0c;然后删除缓…

使用SpringMVC的表单验证

上一篇搭建了基本项目&#xff0c;这一篇在此基础上加入表单验证功能。 第一步&#xff0c;添加command类 Java代码 package test.bean; import javax.validation.constraints.Size; public class User { Size(min3,max30) private String username; …

hdu1247(Hat’s Words)

我以为像a、aa这样的输入应该是没有输出的&#xff0c;结果还是要输出aa。 建树的时候就是常规建树&#xff0c;不过查找的时候要做一些变形&#xff1a;对于一个单词&#xff0c;从第一位检查有没有单词是它的前缀&#xff0c;如果有的话&#xff0c;再去检查它的后半部分是不…

单体、分布式、微服务、Serverless软件架构一览

目录软件架构单体架构分布式应用微服务架构Serverless架构总结Reference软件架构 软件架构就是软件的基本结构&#xff0c;合适的架构是软件成功的最重要因素之一。这里列举了目前流行的4种软件架构。 单体架构 典型的三级架构&#xff1a;前端&#xff08;web/手机端&#…

MyBatis3 association error - The content of element type resultMap must match (constructor?,id*,r...

MyBatis3 association error - The content of element type "resultMap" must match "(constructor?,id*,result*,association*,collection*,discriminator?)" 1.后台错误信息-问题现象&#xff1a; ERROR [geby:Context initialization failed] 2013-0…

Midjourney V6刷屏,但它最可怕的地方居然不是那些神图?

Midjourney在沉寂九个月后推出了Midjourney V6&#xff0c;这个文生图产品体现出的更细腻的细节处理&#xff0c;更强大的语言理解能力和更加“不像AI”的图片效果在过去几天引发一片惊呼。 作为一个闭源的模型产品&#xff0c;Midjourney的魔法配方并不为人所知&#xff0c;但…

HTTP 错误500.19 -Internal Server Error

HTTP 错误500.19 -Internal Server Error 原文:HTTP 错误500.19 -Internal Server Error HTTP 错误500.19 -Internal Server Error 错误代码 0x80070021 asp.net 2009-11-05 16:54:33 阅读484 评论1 字号&#xff1a;大中小 错误摘要 HTTP 错误500.19 -Internal Server Error …