c++11--类型自动推导

1.自动类型推断
1.1.auto
a.auto声明变量的类型必须由编译器在编译时期推导而得。

int main(){double foo();auto x = 1;//x类型为intauto y = foo();// y类型为doubleauto z;// errreturn 0;
}

b.auto声明得变量必须被初始化。
c.针对指针和引用
推导类型是指针类型时,可以使用auto或auto*形式。
推导类型是引用类型时,必须使用auto&形式。

int main()
{int x;auto p = &x;//int*auto* p2 = &x;//int*auto& q = x;// int&auto qq = x;// int 
}

d.针对类型修饰符const 和 volatile
采用auto&形式时,若右边表达式含义const属性,结果类型也含const属性。若没有,则不含。
采用auto形式时,结果类型不会包含const属性。但可通过const auto自行添加。
结果类型不会包含volatile属性。但可通过volatile auto自行添加。

int main()
{auto i = 1;//intconst auto ii = 1;//const intauto& ci = 1;//const int&volatile int p = 1;auto pp = p;// intvolatile ppp = p;//volatile intconst int ci = 1;const int* const cp = &ci;auto t = cp;//const int*。舍弃的const是修饰cp自身的。const int中的const不属于cp,会作为指针指向整体推断出来。
}

e.一次采用auto定义多个变量场景

int main()
{int a;auto * p = &a, q = a;// p为int*,q为intauto qq = a, t = 1.1f;// err。qq =a中auto被推断为int。t=1.1f中auto又被推断为float。
}

e.1.采用auto,一行定义多个变量,多个变量共享auto,其余的类型修饰符各自独立。如修饰p的*对q不起作用。
e,2,采用auto,一行定义多个变量,每个变量定义时推导的auto应该类型一致。qq,t推导的auto不一致,引发了编译报错。
f.不可用场景

#include <iostream>
using namespace std;
void fun(auto x = 1){} // err。auto不可用于修饰函数形参。
struct str{auto var = 10;// err。auto不可用于修饰类型非静态成员字段。
};
int main(){auto z[3] = {1,2,3};//err。auto不可用于修饰数组。std::vector<auto> v = {1};//auto不可用于作为实例化模板的模板参数。
}

1.2.decltype

#include <typeinfo>
#include <iostream>
using namespace std;int main()
{int i;decltype(i) j = 0;cout << typeid(j).name() << endl;float a;double b;decltype(a+b) c;cout << typeid(c).name() << endl;return 0;
}

在这里插入图片描述
(1).decltype的类型推导基于表达式,类型是表达式的结果类型。auto基于初始化时的初始值推导类型。
(2).decltype的类型推导发生在编译时,auto也是。
(3).实例

#include <iostream>// int
// const int// int&
// int&&
// const int&
// const int&&// int*
// const int*
// const int* constint fun1() {return 1;
}
const int fun2() {return 1;
}
int a = 0;
const int ca = 1;
int& fun3() {a = 1;return a;
}
int&& fun4() {a = 1;return std::move(a);
}
const int& fun5(){return 1;
}
const int&& fun6(){return 1;
}
int* fun7(){return &a;
}
const int* fun8(){return &ca;
}
const int* const fun9(){return &ca;
}int main()
{decltype (fun1) a1;decltype (fun2) a2;decltype (fun3) a3;decltype (fun4) a4;decltype (fun5) a5;decltype (fun6) a6;decltype (fun7) a7;decltype (fun8) a8;decltype (fun9) a9;return 0;
}

上述a1~a9推断所得类型将严格和表达式返回类型一致,它们是int、const int、int&、int&&、const int&、const int&&、int*、const int*、const int* const。

1.3.追踪返回类型
(1). 实例

template<typename T1, typename T2>
auto Sum(T1& t1, T2& t2) -> decltype(t1+t2){return t1+t2;
}auto func() -> int
{return 1;
}

上述实例利用追踪返回类型定义函数,追踪返回类型也可用于函数类型声明。
(2).可利用追踪返回类型简化复杂类型定义

#include <type_traits>
#include <iostream>
using namespace std;
int (*(*pf())())(){return nullptr;
}auto pf1() -> auto (*)() -> int (*)(){return nullptr;
}int main(){cout << is_same<decltype(pf), decltype(pf1)>::value << endl;return 0;
}

在这里插入图片描述

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

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

相关文章

C++内存管理和模板初阶

C/C内存分布 请看代码&#xff1a; int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";const char* pChar3 "abcd";int* ptr1 (int*)mallo…

Unity中Shader缩放矩阵

文章目录 前言一、直接相乘缩放1、在属性面板定义一个四维变量&#xff0c;用xyz分别控制在xyz轴上的缩放2、在常量缓存区申明该变量3、在顶点着色器对其进行相乘&#xff0c;来缩放变换4、我们来看看效果 二、使用矩阵乘法代替直接相乘缩放的原理1、我们按如下格式得到缩放矩阵…

Nessus详细安装-windows (保姆级教程)

Nessus描述 Nessus 是一款广泛使用的网络漏洞扫描工具。它由 Tenable Network Security 公司开发&#xff0c;旨在帮助组织评估其计算机系统和网络的安全性。 Nessus 可以执行自动化的漏洞扫描&#xff0c;通过扫描目标系统、识别和评估可能存在的安全漏洞和弱点。它可以检测…

5. 创建型模式 - 单例模式

亦称&#xff1a; 单件模式、Singleton 意图 单例模式是一种创建型设计模式&#xff0c; 让你能够保证一个类只有一个实例&#xff0c; 并提供一个访问该实例的全局节点。 问题 单例模式同时解决了两个问题&#xff0c; 所以违反了单一职责原则&#xff1a; 保证一个类只有一…

鸿蒙开发者工具安装及入门程序

下载工具DevEco Studio IDE 官网下载&#xff1a;HUAWEI DevEco Studio和SDK下载和升级 | HarmonyOS开发者 开发工具的安装 解压下载好的压缩包&#xff0c;一路无脑安装即可&#xff0c;安装完的使用方法类似于IDEA、WebStorm的使用&#xff0c;快捷键一致&#xff0c;默认黑…

day09

文章目录 一、jQuery简介1. 介绍2. 使用1&#xff09;引入2&#xff09;工厂函数 - $()3&#xff09;原生JS对象与jQuery对象4&#xff09;jQuery获取元素5&#xff09;操作元素内容6&#xff09;操作标签属性7&#xff09;操作标签样式8&#xff09;根据层级结构获取元素9&…

当下流行的直播技术demo演示

nginx-http-flv-module&#xff08;更新不是很频繁&#xff09; SRS: https://ossrs.net/lts/zh-cn/&#xff08;独立官网&#xff0c;目前最新稳定版version5&#xff09; 基于SRS搭建直播demo演示&#xff1a; 一、搭建流媒体服务器 参见官网&#xff1a;https://ossrs.ne…

2023.12.22 关于 Redis 数据类型 String 常用命令

目录 引言 String 类型基本概念 SET & GET SET 命令 GET 命令 MSET & MGET MSET 命令 MGET 命令 SETNX & SETEX & PSETEX SETNX 命令 SETEX 命令 PSETEX 命令 计数命令 INCR 命令 INCRBY 命令 DECR 命令 DECRBY 命令 INCRBYFLOAT 命令 总结…

docker笔记2-docker 容器

docker 容器的运行 docker run 镜像名&#xff1a;版本标签&#xff1a; 创建 启动容器 docker run 镜像名 &#xff0c;如果镜像不存在&#xff0c;则会在线下载镜像。 注意事项&#xff1a; 容器内的进程必须处于前台运行状态&#xff0c;不能后台&#xff08;守护进程运行…

iOS - 真机调试的新经验

文章目录 获取真机 UDIDPlease reconnect the device.iOS 开发者模式Fetching debug symbols 很久没有在真机运行 iOS 测试了&#xff0c;今天帮忙调试&#xff0c;发现很多东西都变了&#xff0c;有些东西也生疏了&#xff0c;在这里记录下。 获取真机 UDID 创建Profile 需要…

Spark编程实验三:Spark SQL编程

目录 一、目的与要求 二、实验内容 三、实验步骤 1、Spark SQL基本操作 2、编程实现将RDD转换为DataFrame 3、编程实现利用DataFrame读写MySQL的数据 四、结果分析与实验体会 一、目的与要求 1、通过实验掌握Spark SQL的基本编程方法&#xff1b; 2、熟悉RDD到DataFram…

【qt信号槽-5】信号槽相关注意事项记录

背景&#xff1a; 信号槽是qt很重要的概念&#xff0c;遇到问题帮助没少看。其中就有signals and slots这一章节&#xff0c;说得很到位。 概念琐碎&#xff0c;记录备忘。不对之处望指正。 【qt信号槽-1】槽函数重写问题&#xff0c;qt_metacall和qt_static_metacall-CSDN博…

百模大战中的AI行业:新趋势与未来发展

文章目录 每日一句正能量前言技术进步应用拓展行业变革人才竞争后记 每日一句正能量 人生最重要的价值是心灵的幸福&#xff0c;而不是任何身外之物。 前言 随着科技的迅猛发展&#xff0c;人工智能&#xff08;AI&#xff09;已经成为引领技术革命的重要驱动力之一。在当前的…

Jmeter、postman、python 三大主流技术如何操作数据库?

1、前言 只要是做测试工作的&#xff0c;必然会接触到数据库&#xff0c;数据库在工作中的主要应用场景包括但不限于以下&#xff1a; 功能测试中&#xff0c;涉及数据展示功能&#xff0c;需查库校验数据正确及完整性&#xff1b;例如商品搜索功能 自动化测试或性能测试中&a…

UnityHub无法打开项目问题,打开项目闪退回到hub界面

UnityHub无法打开项目问题&#xff0c;打开项目闪退回到hub界面 UnityHub启动项目闪烁unity界面之后立刻闪退到UnityHub界面情况一&#xff1a;这里这个问题我遇到了很多次情况都不太一样&#xff0c;我先说下我遇到的第一种问题也就是最好解决的一种。许可证到期导致闪退 情况…

怎么为pdf文件添加水印?

怎么为pdf文件添加水印&#xff1f;PDF是一种很好用的文件格式&#xff0c;这种格式能够很有效的保护我们的文件&#xff0c;但有时可能还会被破解&#xff0c;这种时候在PDF上添加水印就是比较好的方法。 综上所述&#xff0c;PDF是保密性很强的文件&#xff0c;但添加水印能够…

在Linux下探索MinIO存储服务如何远程上传文件

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、Cpolar杂谈 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 创建Buckets和Access Keys二. Linux 安装Cpolar三. 创建连接MinIO服务公网地…

系列十一(面试)、如何查看JVM的参数?

一、查看JVM的参数 1.1、概述 上篇文章介绍了JVM的参数类型&#xff0c;通过jinfo可以查看JVM的默认参数&#xff0c;本章介绍另外一种查看JVM参数的方式。 1.2、 分类 JVM中提供了三种方式查看JVM的参数信息&#xff0c;这三种方式又分为两类&#xff0c;即&#xff1a;查看默…

04_线性表

线性表 顺序表顺序表的实现顺序表的遍历顺序表的容量可变顺序表的时间复杂度java中ArrayList实现 链表单向链表单向链表API设计java中LinkedList实现 链表的复杂度分析链表反转快慢指针中间值问题单向链表是否有环问题有环链表入口问题 循环链表约瑟夫问题 栈栈概述生活中的栈计…

HTTP前端请求

目录 HTTP 请求1.请求组成2.请求方式与数据格式get 请求示例post 请求示例json 请求示例multipart 请求示例数据格式小结 3.表单3.1.作用与语法3.2.常见的表单项 4.session 原理5.jwt 原理 HTTP 请求 1.请求组成 请求由三部分组成 请求行请求头请求体 可以用 telnet 程序测…