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、总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

进程启动时,main 函数是如何被找到的?

Linux中一个进程是如何被启动起来的? 一、进程是怎么启动的?二、进程内存空间分段三、进程的入口函数四、总结 一、进程是怎么启动的? 当一个程序被执行时,怎么看出进程的运行呢?一个进程是怎么启动的?为什…

关于 el-table 的合计行问题

目录 一.自定义合计行 二.合计行不展示,只有缩放/变大窗口或者F12弹出后台时才展示 三.合计行出现了表格滚动条下方 四.合计行整体样式的修改 五.合计行单元格样式修改 1.css 2.jsx方式 六.合计行单元格合并 一.自定义合计行 通过 show-summary 属性开启合计…

十三:java web(5)-- Spring数据持久层

目录 Spring 数据持久层 1. Spring 与 JDBC 1.1 使用 Spring 管理数据库连接 1.1.2 Apache Commons DBCP 基于配置文件xml 使用 1.1.3 Apache Commons DBCP 基于配置类使用 1.1.4 HikariCP 基于配置文件xml 使用 推荐使用 Spring Boot 默认连接池 1.1.5 HikariCP 基于配置…

初学者指南:用例图——开启您的软件工程之旅

目录 背景: 基本组成: 关联(Assciation): 包含(Include): 扩展(Extend): 泛化(Inheritance): 完整银行…

基于单片机洗衣机控制器的设计(论文+源码)

1需求分析 在智能洗衣机系统设计中,考虑到洗衣机在实际应用过程中,需要满足用户对于不同衣物清洁、消毒的应用要求,对设计功能进行分析,具体如下: 通过按键实现洗衣机不同工作模式的切换,包括标准模式&am…

qt QFontDialog详解

1、概述 QFontDialog 是 Qt 框架中的一个对话框类,用于选择字体。它提供了一个可视化的界面,允许用户选择所需的字体以及相关的属性,如字体样式、大小、粗细等。用户可以通过对话框中的选项进行选择,并实时预览所选字体的效果。Q…

Python学习从0到1 day27 第三阶段 Spark ③ 数据计算 Ⅱ

目录 一、Filter方法 功能 语法 代码 总结 filter算子 二、distinct方法 功能 语法 代码 总结 distinct算子 三、SortBy方法 功能 语法 代码 总结 sortBy算子 四、数据计算练习 需求: 解答 总结 去重函数: 过滤函数: 转换函数: 排…

今天,智谱「新清影」上线,率先进入有声视频生成时代!还要继续开源宠粉

来,你先把手机音量打开,然后去“听”下面一段视频: 你是不是一脸懵逼?不知道我想表达什么? 视频是AI生成的并不奇怪,但你可能没法相信,这个视频的音效,也是AI生成的。 火车鸣笛 你…

「Mac畅玩鸿蒙与硬件31」UI互动应用篇8 - 自定义评分星级组件

本篇将带你实现一个自定义评分星级组件,用户可以通过点击星星进行评分,并实时显示评分结果。为了让界面更具吸引力,我们还将添加一只小猫图片作为评分的背景装饰。 关键词 UI互动应用评分系统自定义星级组件状态管理用户交互 一、功能说明 …

pdf转excel;pdf中表格提取

一、问题描述 在工作中或多或少会遇到:需要将某份pdf中的表格数据提取出来,以便能够“修改使用”数据 可将pdf中的表格提取出来,解决办法还有点复杂 尤其涉及“pdf中表格不是标准的单元格”的时候,提取数据到excel不太容易 比…

IT架构管理

目录 总则 IT架构管理目的 明确组织与职责 IT架构管理旨在桥接技术实施与业务需求之间的鸿沟,通过深入理解业务战略和技术能力,推动技术创新以支持业务增长,实现技术投资的最大价值。 设定目标与范围 IT架构管理的首要目的是确立清晰的组织…

小红书图文矩阵的运营策略与引流技巧解析

内容概要 小红书图文矩阵是一种高效的内容运营方式,能够帮助品牌在竞争激烈的环境中脱颖而出。通过构建矩阵账号,品牌可以实现多维度的内容覆盖,创造出丰富而立体的用户体验。为什么要做图文矩阵?首先,这种方式能够提…

python中常见的8种数据结构之一元组

元组(tuple)是Python中常见的数据结构之一,它是一个有序、不可变的序列。元组使用圆括号来表示,可以包含任意类型的元素,包括数字、字符串、列表等。元组的元素可以通过索引访问,但是不能修改。 下面是一些…

计算机毕业设计Python+大模型动漫推荐系统 动漫视频推荐系统 机器学习 协同过滤推荐算法 bilibili动漫爬虫 数据可视化 数据分析 大数据毕业设计

作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参与学生毕业答辩指导,…

【leetcode练习·二叉树】用「分解问题」思维解题 I

本文参考labuladong算法笔记[【强化练习】用「分解问题」思维解题 I | labuladong 的算法笔记] 105. 从前序与中序遍历序列构造二叉树 | 力扣 | LeetCode | 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵…

产品经理晋级-Axure中继器制作美观表格

这里的效果,步骤如下: 点击中继器,输入表格信息;在中继器中创建表格内容,把你想要的效果制作在中继器中,表头有几个表格,这边就对应多少个。 按照视频的过程把中继器双击后-样式中的文本内容&am…

防火墙|WAF|漏洞|网络安全

防火墙|WAF|漏洞|网络安全 防火墙 根据内容分析数据包: 1、源IP和目的IP地址 2、有效负载中的内容。 3、数据包协议(例如,连接是否使用 TCP/IP 协议)。 4、应用协议(HTTP、Telnet、FTP、DNS、SSH 等)。 5…

【Linux系统编程】第四十四弹---从TID到线程封装:全面掌握线程管理的核心技巧

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、tid是什么 1.1、理解库 1.2、理解tid 1.3、tid中线程局部存储 2、封装线程 2.1、基本结构 2.2、函数实现 2.3、使用…

医学图像算法之基于Unet的视网膜血管分割

第一步:准备数据 视网膜血管分割数据比较少,但效果好,总共40张 第二步:搭建模型 UNet主要贡献是在U型结构上,该结构可以使它使用更少的训练图片的同时,且分割的准确度也不会差,UNet的网络结构…

ARM死机(HardFault)调试技巧详解(栈回溯,不破坏现场)

目录 Keil调试技巧: 一.不破坏现场连接仿真器与进入debug 二.栈回溯 死机调试示例 J-Link调试方法 示例:空指针异常 不能连接烧录器或者读取内存怎么办? 在日常开发中,经常会遇到单片机卡死机等问题,经常很难定…