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

news2024/11/26 14:56:19

1、概念

        C++20 中引入新的编译期关键字 concept 用于创建概念。个人认为将其翻译为“构思”更为贴切。直接使用时,它更像一个只能用于模板的布尔类型关键字。

         而如果用于模板中,他会将模板类型先带入自身,当自身条件为 true 才会实例化模板,否则该模板被弃置。因此该关键字几乎全用于 SFINAE 规则。

         如上图, foo 将因为找不到匹配模板而报错。

        因此只需要通过逻辑条件运算符将多条语句进行列举即可。

        此外,概念还可用于简写模板之中,只需写在 auto 之前即可:

        同样,第一个 foo 调用符合概念,而传入 char 类型违反概念,因此该行报错,找不到模板。

        因此概念是通过约定模板需要满足的条件来使用 SFINAE 规则的关键字。

2、约束

        C++20 中引入另一个关键字 requires。不同于 concept , requires 关键字可以使用户无需定义概念而对模板添加实例化的条件。当然不仅仅如此,个人觉得 requires 的用法特别混乱,没办法简单几句话概括其用法。

        用英语单词来作对比,requires有动词和名词两种用法。在语法中也可以这么理解,主句的 requires 是动词,从句则是名词。

1、requires主句

        requires 主句后跟布尔值类型的表达式,表示要求达成后续条件。因此,之前例子中的概念也可用 requires 主句将其写到同一个模板中。

        此外,因为概念的表达式值也是布尔类型,因此以下写法也是合法的: 

        题外话,这时候还可以对比 bool 类型的常量模板,会发现布尔类型的常量模板和概念特别相似,只不过概念可以放到定义模板的尖括号中,而布尔常量不行:

        总之,requires 主句只需要后续表达式值为 true 则允许实例化模板,否则该模板将被放弃匹配。 

2、requires从句

        requires 从句与主句不同,它后面必须跟花括号,括号中的表达式必须在编译期能够确定。并且,requires 从句的结果只有语法不允许和 true 两种,也就是说,在非模板中使用,只要编译能通过,它的值一定是 true ,它更像是条件的集合。根据此特性,requires 从句往往用于模板中以匹配 SFINAE 规则。

        上图中两个 requires 第一个必然是主句,用于要求后续条件符合。第二个 requires 便是从句,它要求 T::type1 和 T::type2 是合法语句才会返回 true 。 X 类型不符合该规则,该模板被弃置, foo<X> 无匹配模板。而 Y 符合该条件, foo<Y> 将被实例化。

        此外,从句的 requires 还允许后续紧跟一对括号用于类型的编译期的实例化。编译期的实例化并不会被真正实例化,只是用于检查实例化后的对象是否符合某种特性。

        可见该约束要求类型支持解引用和同类型相加的操作, X 类型不符合该规则,只有 foo<Y> 能被正确实例化。

3、再说主句与从句

        先提个毫无意义的小 tip ,requires 的主句和从句可以互相无限嵌套。接下来的内容不考虑嵌套约束的情况,仅讨论 requires 子句中使用普通表达式的情况。

         仅仅使用普通表达式作为子句的约束条件,子句只要有返回值,只有可能是 true 这一种结果。在非模板中,如果 requires 子句中的表达式非法是直接报错,非模板环境不存在 SFINAE 机制。

        如上图,报错信息与直接在 main 函数中使用该表达式的报错没有任何不同。 

        不可认为 requires 主句是因为从句不符合语法而返回 false 而启动 SFINAE 机制。之所以模板中的约束使得模板不被实例化是因为子句条件不符合而被抛弃,类似于以下模板中第二个模板默认类型形参的不符合。

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

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

相关文章

Everything软件实现FTP功能

Windows的文件共享和ftp实在难用&#xff0c;这里介绍一种新的局域网内共享文件的方法 下载 Everything 选择想要共享的文件&#xff0c;选择包含到数据库&#xff0c;注意&#xff1a;要在对应的分卷设置&#xff0c;共享文件夹名称不要包含中文字符&#xff0c;因为Windows底…

系统管理与规划师

综合 工业化、信息化两化融合&#xff1a;战略、资源、经济、设备和技术的融合 诺兰6时期&#xff1a;&#xff08;初普控&#xff0c;整数成&#xff09;初始、普及、控制、整合、数据管理、成熟期&#xff1b;技术转型期介于控制和整合间 IT战略规划 IT战略制定&#xff1a;使…

初始MQ(安装使用RabbitMQ,了解交换机)

目录 初识MQ一&#xff1a;同步调用二&#xff1a;异步调用三&#xff1a;技术选型 RabbitMQ一&#xff1a;安装部署二&#xff1a;快速入门三&#xff1a;数据隔离 java客户端一&#xff1a;快速入门二&#xff1a;workqueues三&#xff1a;Fanout交换机四&#xff1a;Direct交…

[C++11] 类中新特性的添加

默认的移动构造和移动赋值 在 C11 之前&#xff0c;编译器会为每个类自动生成默认的构造函数、析构函数、拷贝构造函数、拷贝赋值运算符等函数&#xff0c;以实现对象的创建、销毁和拷贝操作。但拷贝操作会复制整个对象的数据&#xff0c;效率低&#xff0c;尤其是在处理大对象…

emr上使用sparkrunner运行beam数据流水线

参考资料 https://time.geekbang.org/column/intro/167?tabcatalog Apache Beam和其他开源项目不太一样&#xff0c;它并不是一个数据处理平台&#xff0c;本身也无法对数据进行处理。Beam所提供的是一个统一的编程模型思想&#xff0c;而我们可以通过这个统一出来的接口来编…

github高分项目 WGCLOUD - 运维实时管理工具

GitHub - tianshiyeben/wgcloud: Linux运维监控工具&#xff0c;支持系统硬件信息&#xff0c;内存&#xff0c;CPU&#xff0c;温度&#xff0c;磁盘空间及IO&#xff0c;硬盘smart&#xff0c;GPU&#xff0c;防火墙&#xff0c;网络流量速率等监控&#xff0c;服务接口监测&…

MyBatisPlus 用法详解

文章目录 一、快速入门1.1 引入依赖&#xff1a;1.2 定义 Mappper&#xff1a;1.3 使用演示&#xff1a;1.4 常见注解&#xff1a;1.4.1 TableName:1.4.2 TableId&#xff1a;1.4.3 TableField&#xff1a; 1.5 常见配置&#xff1a; 二、核心功能2.1 条件构造器&#xff1a;2.…

Python小游戏23——捕鱼达人

首先&#xff0c;你需要安装Pygame库。如果你还没有安装&#xff0c;可以使用以下命令进行安装&#xff1a; 【bash】 pip install pygame 运行效果展示 接下来是示例代码&#xff1a; 【python】 import pygame import random # 初始化Pygame pygame.init() # 屏幕尺寸 SCREEN…

库打包工具 rollup

库打包工具 rollup 摘要 **概念&#xff1a;**rollup是一个模块化的打包工具 注&#xff1a;实际应用中&#xff0c;rollup更多是一个库打包工具 与Webpack的区别&#xff1a; 文件处理&#xff1a; rollup 更多专注于 JS 代码&#xff0c;并针对 ES Module 进行打包webpa…

基于SSM+VUE小学生素质成长记录平台JAVA|VUE|Springboot计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统&#xff1a;Window操作系统 2、开发工具&#xff1a;IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

【架构设计常见技术】

EJB EJB是服务器端的组件模型&#xff0c;使开发者能够构建可扩展、分布式的业务逻辑组件。这些组件运行在EJB容器中&#xff0c;EJB将各功能模块封装成独立的组件&#xff0c;能够被不同的客户端应用程序调用&#xff0c;简化开发过程&#xff0c;支持分布式应用开发。 IOC …

优选算法 - 1 ( 双指针 移动窗口 8000 字详解 )

一&#xff1a;双指针 1.1 移动零 题目链接&#xff1a;283.移动零 class Solution {public void moveZeroes(int[] nums) {for(int cur 0, dest -1 ; cur < nums.length ; cur){if(nums[cur] 0){}else{dest; // dest 先向后移动⼀位int tmp nums[cur];nums[cur] num…

鸿蒙操作系统是什么?与安卓系统有什么区别?

鸿蒙操作系统 鸿蒙操作系统&#xff08;HarmonyOS&#xff09;是华为公司发布的一款基于微内核的面向全场景的分布式操作系统。 发展历程&#xff1a; 早期规划&#xff1a;华为从2012 年开始规划自有操作系统&#xff0c;并在芬兰赫尔辛基设立智能手机研发中心&#xff0c;招…

现场工程师日记-MSYS2迅速部署PostgreSQL主从备份数据库

文章目录 一、概要二、整体架构流程1. 安装 MSYS2 环境2. 安装postgresql 三、技术名词解释1.MSYS22.postgresql 四、技术细节1. 创建主数据库2.添加从数据库复制权限3. 按需修改参数&#xff08;1&#xff09;WAL保留空间&#xff08;2&#xff09;监听地址 4. 启动主服务器5.…

第二届计算机网络技术与电子信息工程国际学术会议(CNTEIE 2024,12月6-8日)

第二届计算机网络技术与电子信息工程国际学术会议&#xff08;CNTEIE 2024&#xff09; 2024 2nd International Conference on Computer Network Technology and Electronic and Information Engineering 重要信息 会议官网&#xff1a;www.cnteie.org 2024 2nd Internation…

Git 入门篇(一)

前言 操作系统&#xff1a;win11 64位 与gitee搭配使用 Git 入门篇&#xff08;一&#xff09; Git 入门篇&#xff08;二&#xff09; Git 入门篇&#xff08;三&#xff09; 目录 git下载、安装与配置 下载 安装 配置 git下载、安装与配置 下载 官网&#xff1a;git-…

WPS文档中的“等线”如何删除

如何删除“等线”占用的行如何删除表格之间的空行WPS文档中的“等线”是什么如果删除脚注文本占用的行 如下这种&#xff0c;在文档中添加了表格和脚注&#xff0c;发现上下表格之间有多行空行&#xff0c;鼠标选中&#xff0c;显示是“等线”&#xff0c;那么如何去除等线占用…

题目讲解15 合并两个排序的链表

原题链接&#xff1a; 合并两个排序的链表_牛客题霸_牛客网 思路分析&#xff1a; 第一步&#xff1a;写一个链表尾插数据的方法。 typedef struct ListNode ListNode;//申请结点 ListNode* BuyNode(int x) {ListNode* node (ListNode*)malloc(sizeof(ListNode));node->…

计算机网络基本概念总结

IP地址 概念 使网络中的设备都有唯一的地址标识&#xff0c;用于表示其在网络中的位置。 格式 IP地址是一个32位的二进制数&#xff0c;通常被分割为4个8位二进制数&#xff08;也就是4个字节&#xff09;&#xff0c;如&#xff1a;01100100.00001000.00001010.00000110。通常…

Pandas | 特征列大量数据异常需要填充数据时注意事项

问题描述 一组数据如下&#xff1a; df.isnull().sum()城市 0 名称 0 星级 1529 评分 0 价格 1 销量 1 省/市/区 0 坐标 0 简介 41 是否免费 0 具体地址 3 dtype: int64df[星级]0…