C++20 概念与约束(3)—— 约束的进阶用法

  《C++20 概念与约束(1)—— SFINAE》

  《C++20 概念与约束(2)—— 初识概念与约束》

●《C++20 概念与约束(3)—— 约束的进阶用法》

1、再谈约束主句与从句

        上一篇文章中提到过约束可以无限嵌套。末尾也提到不考虑嵌套约束的情况下,模板因为 SFINAE 规则的存在,其中 requires 子句只要存在返回值,只有可能是 true 这一种结果。在非模板中,如果 requires 子句中的表达式非法是直接报错。

        那如果 requires 子句中的表达式是合法的但是不符合要求呢?如下图所示。接下来再讨论嵌套约束的情况。

        不同于布尔值的 true false ,requires 主句对后续表达式的处理后将得到符合要求与不符合要求两种结果。非法表达式也是一种不符合要求的情况。在 SFINAE 规则中,这两种不符合要求是等价的。简单概括就是,主句将布尔值转换为是否符合要求,从句将是否符合要求转换为布尔值。因此如第一张图中所示, requires 嵌套可以通过来回转换进而层层向外传递,最终被 r 接收。

        以上这段内容对理解约束至关重要。

2、复合约束

1、decltype

        在讨论复合约束之前,需稍微补充个 decltype 的冷知识。先看现象:

        之所以唯独 decltype((n)) 不是 int 类型,因为规定了当 decltype 中的表达式是括号表达式并且括号中表达式是左值时,将它当作左值引用类型。

2、约束中的“{}”和“->”

        复合约束更像是 requires 嵌套的简便写法。其实并没简便多少,但是更符合语义。

        上图中①和②是等价的。其中①是简便写法,编译器会自动将 {表达式} 识别为 decltype((表达式)),解析后插入到 “->” 符号后紧跟的概念的第一个类型参数中。 “->” 符号之后只允许使用概念。而②的表达式允许使用概念或者布尔类型的常量模板。

        刚才提到的 decltype 补充要点在这里需要十分注意,避免写出以下代码:

        此外,花括号后还可用 noexcept 来指明花括号中的表达式不会抛出错误。

3、模板偏特化中的约束 

        现在要对某几个类型的模板类型形参进行匹配到偏特化版本。模板匹配规则是找最匹配的模板进行实例化。最匹配的自然是符合的要求越多越匹配。因此可以对模板进行约束以增加匹配要求来进行偏特化。

        同样,也可以使用概念来偏特化该模板。在这里可以感觉到,概念更像是约束的容器,虽然它的表达式是布尔值。

        自然地,也可以对特定类型的指针、引用、CV限定符进行特化:

4、总结

         概念与约束的全部内容到此就以全部介绍完毕。要彻底了解概念与约束,只需要当作拼积木一般,将所有要求进行分类,如是否合法,是否符合要求,重点在于知道自己在写什么。尤其是约束,用法其实并不多,但初次接触难免觉得杂乱,需要多加使用才能掌握。

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

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

相关文章

c#使用COM接口设置excel单元格宽高匹配图片,如何计算?

c#使用COM接口设置excel单元格宽高如何换算 在实际工作中,经常需要在excel中插入图片。并设置单元格与图片对齐。但是excel单元格的宽度和高度使用不同的单位。单元格的宽度以字符宽度为单位,而高度以点为单位。如果按照实际值来设置,例如设…

pySpark乱码

1.现象 python的变量包含中文,用format放入SQL中时,出现乱码 2.原因 python2默认编码是ascii 3.解决办法 使用python3,并且把所有print,改成带括号的 4.在pyspark中加入参数 spark.pyspark.driver.python/usr/bin/python3 …

从 MySQL 5.7 到 8.0:理解 GROUP BY 的新规则与实战优化20241112

🎯 从 MySQL 5.7 到 8.0:理解 GROUP BY 的新规则与实战优化 🔎 引言 随着 MySQL 的不断升级,从 5.7 到 8.0,不仅性能得到提升,其对 SQL 标准的严格执行也显著提高。GROUP BY 的行为变化就是一个典型例子。…

【activiti工作流源码集成】springboot+activiti+mysql+vue+redis工作流审批流集成整合业务绑定表单流程图会签驳回

工作流集成实际项目案例,demo提供 源码获取方式:本文末个人名片直接获取。 前言 activiti工作流引擎项目,企业erp、oa、hr、crm等企事业办公系统轻松落地,请假审批demo从流程绘制到审批结束实例。 一、项目形式 springbootvue…

如何判断FPGA能够接入几个Camera

摘要:仅记录判断FPGA能够接入几个Camera的思路 在FPGA中,"quad"和"bank"是两个不同的概念,它们通常用于描述FPGA中的高速串行收发器(如Xilinx的GTX或GTH收发器)的组织方式。 Quad: 一个Quad包含…

CKA认证 | Day2 K8s内部监控与日志

第三章 Kubernetes监控与日志 1、查看集群资源状态 在 Kubernetes 集群中,查看集群资源状态和组件状态是非常重要的操作。以下是一些常用的命令和解释,帮助你更好地管理和监控 Kubernetes 集群。 1.1 查看master组件状态 Kubernetes 的 Master 组件包…

推荐一款好用的postman替代工具2024

Apifox 是国内团队自主研发的 API 文档、API 调试、API Mock、API 自动化测试一体化协作平台,是非常好的一款 postman 替代工具。 它通过一套系统、一份数据,解决多个系统之间的数据同步问题。只要定义好接口文档,接口调试、数据 Mock、接口…

《自动化运维》

一、引言 在当今信息技术飞速发展的时代,企业的 IT 系统规模不断扩大,复杂性日益增加。传统的手工运维方式已经无法满足高效、稳定、可靠的运维需求。自动化运维作为一种先进的运维理念和技术手段,正逐渐成为企业提升 IT 运维效率和质量的关键…

相机光学(四十二)——sony的HDR技术

1.概述 索尼的HDR技术包括以下几种,这些技术共同构成了索尼在HDR领域的技术矩阵,旨在提供更宽广的动态范围、更丰富的色彩表现以及更真实的光影效果: Multi-frame HDR(多帧异曝光HDR):这是一种通过不同曝光时间图像的多帧合成来实…

Springboot环境搭建详解

springboot学习视频记录: 笔记: a:Springboot maven常见依赖、配置文件笔记-CSDN博客 b:Springboot环境搭建详解-CSDN博客 day01 6:springboot的parent和starter依赖- a 7:启动类的位置配置- b 8&am…

uniapp+vue2 设置全局变量和全局方法 (兼容h5/微信小程序)

一,Vue.prototype.xxx 问题:js可以使用,但是微信小程序,在template 模板无法使用 二,globalData 问题同上,优点就是,.js文件也可以使用。但是微信小程序,在template 模板无法使用…

gdb调试redis。sudo

1.先启动redis-server和一个redis-cli。 2.ps -aux|grep reids查看redis相关进程。 3.开始以管理员模式附加进程调试sudo gdb -p 2968.注意这里不能不加sudo,因为Redis 可能以 root 用户启动,普通用户无法附加到该进程。否则就会出现可能下列情形&#…

uniapp 设置安全区域

<!-- 获取安全区域 --> <script setup lang"ts"> import { computed, ref } from vuelet systemType ref(1) // #ifdef APP-PLUS || H5 || APP-PLUS-NVUE systemType.value 1 const { safeAreaInsets } uni.getSystemInfoSync() console.log(safeAre…

YUM 的使用

YUM 是一个用于 Fedora 和 Red Hat 以及 CentOS 操作系统的前端软件包管理器&#xff0c;它可以自动处理依赖关系并一次性安装所有必需的软件包。 镜像站点选择 1. 备份原有的镜像源配置文件 系统默认的 yum 镜像源配置文件存储在 /etc/yum.repos.d/ 目录下&#xff0c;可以…

力扣 LeetCode 242. 有效的字母异位词(Day3:哈希表)

解题思路&#xff1a; 哈希表三种数据结构的选择 1. 数组&#xff1a;适用于数据量小的情况 2. set&#xff1a;适用于数据量大的情况 3. map&#xff1a;适用于key-value 什么时候用哈希表&#xff1f; 给你一个元素&#xff0c;判断该元素在这个集合里是否出现过 本题使…

【MYSQL】锁详解(全局锁、表级锁、行级锁)【快速理解】

目录 一、全局锁 二、表级锁 1.表锁 2.元数据锁 3.意向锁 三、行级锁 1. 行锁 2.间隙锁 3.临建锁 锁是处理并发情况下&#xff0c;对数据的一致性的关键因素&#xff0c;也是并发情况下对效率影响非常大的。 1、全局锁&#xff1a;锁定表中所有数据。 2、表级锁&#xff1a;…

蓝桥杯每日真题 - 第11天

题目&#xff1a;&#xff08;合并数列&#xff09; 题目描述&#xff08;14届 C&C B组D题&#xff09; 解题思路&#xff1a; 题意理解&#xff1a;给定两个数组&#xff0c;目标是通过若干次合并操作使两个数组相同。每次合并操作可以将数组中相邻的两个数相加&#xff…

Anaconda 和 conda 是什么关系?就像 pip 和 python 一样吗

Anaconda 和 conda是 Anaconda Distribution 还是 Miniconda Anaconda 和 conda Anaconda 和 conda 之间的关系有点类似于 pip 和 Python&#xff0c;但又有所不同。 Anaconda 是一个数据科学和机器学习的发行版&#xff0c;它包含了 Python、conda 以及许多预装的库和工具&am…

contos7.9 部署3节点 hadoop3.4 集群 非高可用

contos7.9 部署3节点 hadoop3.4 集群 非高可用 contos7.9 部署3节点 hadoop3.4 集群 非高可用环境信息服务器角色分配服务器配置服务器配置初始化 init_server.sh配置主机名映射所有节点配置 hosts文件 配置免密登录 hadoop 安装环境配置下载安装包下载 jdk1.8hadoop3.4 分发安…

linux之时间服务器

序 在项目开发中,各个模块的时间同步是一个重要的机制;那么如何在linux上搭建时间服务器呢?并且客户端怎么与服务器进行时间同步呢? 时间服务器搭建 linux中有两种时间服务器: ntp服务器和chrony服务器 1.ntp服务器 1.1 安装 apt install ntp 1.2 配置 配置文件一般在…