4decltype说明符

news2024/9/21 18:58:48

4.1 回顾typeof和typeid
 

在C++11之前的显示

int a = 0;
typeof(a) b = 5;//typeof并非C++标准

//以及
int x1 = 0;
double x2 = 5.5;
std::cout << typeid(x1).name() << std::endl;
std::cout << typeid(x1 + x2).name() << std::endl;
std::cout << typeid(int).name() << std::endl;
//typeid的返回值是一个左值,且其生命周期一直被扩展到程序生命周期结束。

返回的是一个std::type_info对象的引用,这就是所说的“返回值是一个左值”。由于返回的是引用,其生命周期与程序相同,因此其所引用的std::type_info对象的生命周期会持续到程序结束。

type_info& operator=(const type_info&) = delete;

typeid返回的std::type_info删除了复制构造函数,若想保存std::type_info,只能获取其引用或者指针

auto t1 = typeid(int); // 编译失败,没有复制构造函数无法编译
auto &t2 = typeid(int); // 编译成功,t2推导为const std::type_info&
auto t3 = &typeid(int); // 编译成功,t3推导为const std::type_info*

typeid的返回值总是忽略类型的 cv 限定符,也就是typeid(const T)== typeid(T))。
虽然typeid可以获取类型信息并帮助我们判断类型之间的关系,但遗憾的是,它并不能像typeof那样在编译期就确定对象类型

4.2 使用decltype说明符

 使用decltype说明符可以获取对象或者表达式的类型,其语法与typeof类似:

   int x1 = 0;
   decltype(x1) x2 = 0;
   std::cout << typeid(x2).name() << std::endl; // x2的类型为int
   double x3 = 0;
   decltype(x1 + x3) x4 = x1 + x3;
   std::cout << typeid(x4).name() << std::endl; // x1+x3的类型为double
   decltype({ 1, 2 }) x5; // 编译失败,{1, 2}不是表达式
template <class A,class B, class C> //最原始的泛化函数 这个就是每次调用需要加入函数返回值类型
A sum(B b, C c)
{
    return b + c;
}
sum<double>(10,15.3);


template <class B, class C>
auto sum(B b, C c)->decltype(b + c)//这个是c++11的写法 
{
    return b + c;
}

template <class B, class C>//c++十四之后就支持auto推导
auto sum(B b, C c)
{
    return b + c;
}


//现在可以这么写        decltype(auto) sum(B b, C c)  基本上无敌

//书上说auto不能用引用 但是加个 auto& 不就可以了

4.3 推导规则
 

个人总结就是 它括号里是什么类型就原封不动 函数是返回值类型

有几个特别的点

int x;
decltype(x);//这个得到的就是int 
decltype((x));//这个得到int&
static_assert(std::is_same_v<decltype((x)), int&>, "Type should be int&");
static_assert(std::is_same_v<decltype(x), int&>, "Type should be int&");//这个会报错
//说明(x)就是int&类型 
int a[10];
decltype(a[3])//int&
static_assert(std::is_same_v<decltype(a[3]), int&>, "Type should be int&");

a[3]是int&类型

4.4 cv限定符的推导

struct A {
    double x;
};
const A* a = new A();
decltype(a->x); // decltype(a->x)推导类型为double, const属性被忽略

decltype((a->x));//加括号就会推导为 cont double &

4.5 decltype(auto)

参考4.2

4.6 decltype(auto)作为非类型模板形参占位符

#include <iostream>
template<decltype(auto) N>
void f()
{
    std::cout << N << std::endl;
}static const int x = 11;
static int y = 7;
int main()
{
    f<x>(); // N为const int类型
    f<(x)>(); // N为const int&类型
    f<y>(); // 编译错误
    f<(y)>(); // N为int&类型
}

这是在C++17中推出的

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

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

相关文章

Windows上创建批处理.bat文件并且注册为开机自启(Python-web微服务)

1. winodws桌面点击创建文本文件 &#xff08;文件名称.txt&#xff09; 2. 将如下代码写入txt文件中 echo off if "%1""h" goto begin start mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h"…

马踏棋盘c++

马踏棋盘c 题目回溯问题模型特征模型 代码 题目 马踏棋盘算法&#xff0c;即骑士周游问题。将马放在国际象棋的 88 棋盘的某个方格中&#xff0c;马按走棋规则(马走日字)进行移动。每个方格只进入一次&#xff0c;走遍棋盘上全部 64 个方格。 回溯问题模型 特征 解组织成树…

JavaWeb初阶 day1

目录 tomcat目录结构 tomcat:web服务器软件 项目部署的方式 直接将项目放到webapps下 配置conf/server.xml文件 在conf\Catalina\localhost创建任意名称的xml文件。在文件中编写 静态项目和动态项目 Servlet Servlet执行原理 Servlet方法&#xff08;生命周期&#x…

数字化转型的理论框架对比:从多维视角指导企业成功变革对比DPBOKIT4ITCOBITTOGAF

数字化转型的多维框架解析 在数字化时代&#xff0c;企业如何有效实现数字化转型已成为其生存和发展的关键问题。然而&#xff0c;市场上关于数字化管理的各种框架和理论并存&#xff0c;企业需要根据自身的需求选择最适合的指导路径。本文将通过对几个核心理论框架的对比&…

亿发工单系统:让任务风平浪静

在现代企业的日常运营中&#xff0c;工单管理系统已经成为必不可少的工具&#xff0c;无论是生产制造、IT运维&#xff0c;还是客服支持&#xff0c;工单系统的存在都是为了高效处理任务、跟踪进展、分配资源。然而&#xff0c;现实中的工单管理&#xff0c;往往不是“风平浪静…

初识模版!!

初识模版 1.泛型编程1.1 如何实现一个交换函数呢&#xff08;使得所有数据都可以交换&#xff09;&#xff1f;1.2 那可以不可以让编译器根据不同的类型利用该模子来生成代码呢&#xff1f; 2.模版类型2.1 模版概念2.2 函数模版的原理2.3 函数模板的实例化2.4 模板参数的匹配原…

linux 操作系统下dhcpd命令介绍和案例应用

linux 操作系统下dhcpd命令介绍和案例应用 DHCP&#xff08;动态主机配置协议&#xff09;在Linux操作系统中用于自动为网络中的设备分配IP地址和其他网络配置 DHCP的基本概念 DHCP协议通过UDP工作&#xff0c;主要有两个用途&#xff1a; 自动分配IP地址给网络中的设备。提…

化学分子结构检测系统源码分享

化学分子结构检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

git push出错Push cannot contain secrets

报错原因&#xff1a; 因为你的代码里面包含了github token明文信息&#xff0c;github担心你的token会泄漏&#xff0c;所以就不允许你推送这些内容。 解决办法&#xff1a; 需要先把代码里面的github token信息删除掉&#xff0c;并且删掉之前的历史提交&#xff0c;只要包…

【远程调用PythonAPI-flask】

文章目录 前言一、Pycharm创建flask项目1.创建虚拟环境2.创建flask项目 二、远程调用PythonAPI——SpringBoot项目集成1.修改PyCharm的host配置2.防火墙设置3.SpringBoot远程调用PythonAPI 前言 解决Pycharm运行Flask指定ip、端口更改无效的问题 首先先创建一个新的flask项目&…

变电站绝缘套管红外检测数据集

包含以下4个数据文件&#xff1a; /train&#xff1a;训练集 /valid&#xff1a;验证集 /test&#xff1a;测试集 README.txt&#xff1a;数据说明 【数据说明】检测目标以Pascal VOC格式进行标注&#xff0c;对每个图像进行以下预处理&#xff0c;统一调整大小为640x640。数据…

FLUX.1+ComfyUI部署与使用:图像合成技术的新高度

✨ Blog’s 主页: 白乐天_ξ( ✿&#xff1e;◡❛) &#x1f308; 个人Motto&#xff1a;他强任他强&#xff0c;清风拂山冈&#xff01; &#x1f4ab; 欢迎来到我的学习笔记&#xff01; FLUX.1的版本 FLUX.1是由黑森林实验室&#xff08;[Black Forest Labs](https://bla…

【设计模式-备忘录】

备忘录模式&#xff08;Memento Pattern&#xff09;是一种行为型设计模式&#xff0c;用于保存对象的内部状态&#xff0c;以便在将来某个时间可以恢复到该状态&#xff0c;而不暴露对象的内部实现细节。备忘录模式特别适合在需要支持撤销&#xff08;Undo&#xff09;操作的应…

如何在多台Linux虚拟机上安装和配置Kafka集群

Kafka是一个高性能、分布式的流处理平台&#xff0c;被广泛应用于大规模实时数据处理场景。它具有高吞吐量、低延迟和可水平扩展等特点&#xff0c;能够有效地处理海量数据流。为了提高Kafka的可用性和容错性&#xff0c;通常会在多个节点上部署Kafka集群。在这个指南中&#x…

十大排序(一):冒泡排序

目录 一、简介 实现过程 时间复杂度 二、代码实现 函数声明 Swap函数 单趟 多趟 测试 优化 一、简介 冒泡排序是一种简单的排序算法&#xff0c;它重复地比较相邻的两个元素&#xff0c;如果顺序错误就交换它们&#xff0c;直到没有元素需要交换为止。这个过程类…

获取zabbix API 监控数据shell脚本,自动日常巡检服务器信息、并发送指定群组

一&#xff0c;前言 有zabbix监控&#xff0c;也并不是时刻盯着数据&#xff0c;所以想着&#xff0c;每天固定某个时刻&#xff0c;自动发送服务器数据到指定群组&#xff0c;给其他人更直观的数据。 数据就可以从zabbix API获取。参考官方API文档&#xff1a;https://www.z…

如何使用IIC外设(硬件IIC)

本文重点叙述如何使用芯片自带的 IIC 外设&#xff0c;即硬件 IIC&#xff0c;实现 IIC 通信。文章《IIC通信基础_cpu的iic通信-CSDN博客》 中&#xff0c;叙述了软件 IIC 通信和硬件 IIC 通信的区别&#xff0c; 并且重点叙述了 IIC 的通信协议。在使用软件进行 IIC 通信时&am…

git安装包夸克网盘下载

git安装包夸克网盘下载 git夸克网盘 git网站上的安装包下载速度有点慢&#xff0c;因此为了方便以后下载就将文件保存到夸克网盘上&#xff0c;链接&#xff1a;我用夸克网盘分享了「git」&#xff0c;点击链接即可保存。 链接&#xff1a;https://pan.quark.cn/s/07c73c4a30…

MongoDB在Linux系统中的安装与配置指南

在这篇文章中&#xff0c;我们将介绍如何在CentOS 7服务器上安装MongoDB&#xff0c;并通过DataX将数据从MongoDB迁移到MySQL数据库。这将包括MongoDB的安装、配置、数据准备以及使用DataX进行数据迁移的详细步骤。 MongoDB简介 MongoDB是一个高性能、开源、无模式的文档型数据…

c++9月20日

1.思维导图 2.顺序表 头文件 #ifndef RECTANGLE_H #define RECTANGLE_H#include <iostream>using namespace std;using datatype int ;//类型重定义class Seqlist { private://私有权限datatype *ptr; //指向堆区申请空间的起始地址int size;//堆区空间的长度int len …