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

embedded/2024/11/14 7:25:21/

  《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.ppmy.cn/embedded/137439.html

相关文章

三星手机投屏到MacBook的方法,多台手机同屏展示

技术不仅让信息分享变得更加便捷,还有效提升了工作效率。AirDroid Cast手机投屏到电脑的操作就是通过扫描二维码的方式轻松建立起两者之间的连接桥梁,整个过程简单快捷,几乎不需要任何专业知识背景就能上手使用。 怎样将三星手机屏幕投射到Ma…

mybatis-plus: mapper-locations: “classpath*:/mapper/**/*.xml“配置!!!解释

和mybatis一样的道理!!!!如果不指定这个配置,通常要求 XML 映射文件和 Mapper 接口的包名和结构相同!!!! 如果没有配置 mapper-locations,通常文件结构应遵循…

深度学习项目启动(笔记用)

深度学习项目启动 项目配置虚拟环境 项目配置虚拟环境

[CKS] K8S AppArmor Set Up

最近准备花一周的时间准备CKS考试,在准备考试中发现有一个题目关于AppArmor Pod操作权限的问题。 ​ 专栏其他文章: [CKS] Create/Read/Mount a Secret in K8S-CSDN博客[CKS] Audit Log Policy-CSDN博客 -[CKS] 利用falco进行容器日志捕捉和安全监控-CSDN博客[CKS] …

异步处理之async/await使用技巧分享

前言 async/await是非常强大的语法糖,是处理异步问题的一种简洁、高效的方式。虽然它并非“最终解决方案”,但与Promise配合使用,确实能极大地简化异步编程的复杂性。 从字面上理解,async 表示一个函数是异步的,awai…

anzocapital 昂首资本:外汇机器人趋势判断秘籍

再盲目交易而不借助像 anzocapital 昂首资本所了解的外汇机器人趋势判断方法,投资者在外汇市场将面临亏损的风险,anzocapital 昂首资本深知交易策略的重要性,就像外汇机器人确定趋势方向的方法,对投资者有着非凡的意义。 在外汇交…

入门网络安全工程师要学习哪些内容(详细教程)

🤟 基于入门网络安全/黑客打造的:👉黑客&网络安全入门&进阶学习资源包 大家都知道网络安全行业很火,这个行业因为国家政策趋势正在大力发展,大有可为!但很多人对网络安全工程师还是不了解,不知道网…

高频 SQL 50 题(基础版)连接部分

1、使用唯一标识码替换员工ID # Write your MySQL query statement below SELECT b.unique_id, a.name FROM Employees as a LEFT JOIN EmployeeUNI as b ON a.id b.id;2、产品销售分析 I # Write your MySQL query statement below SELECTp.product_name, s.year, s.price …