c++ - 为什么我不能约束一个概念
问题描述
不允许约束这样的概念:
template<typename T>
concept A = expr_1;
template<A T>
concept B = expr_2; // error
但是,似乎总是可以像这样实现相同的结果:
template<typename T>
concept A = expr_1;
template<typename T>
concept B = A<T> && expr_2; // ok
如果总是可以将其重写为第二个,那么不允许第一个版本的原因是什么?
解决方案
从功能设计的角度来看,用户不必在多个地方查找相同的信息。
Aconcept
在其模板参数上定义了一系列约束。这些约束列在=
符号之后;这就是他们的重点。因此,用户应该能够通过找到=
标志并查看其后的表达式来了解有关概念的所有内容。
你的方式意味着我最多需要查看三个地方:模板参数定义的约束,requires
模板头的子句(现在必须有可能,因为这是定义受约束参数的方式),以及=
符号后面的表达式。
当您可以正确拼写出来时,为什么还要为增加的复杂性而烦恼呢?代码的阅读频率高于编写频率,因此我们应该倾向于更简单的阅读而不是方便的写作。
从功能定义的角度来看,aconcept
只是一个constexpr static bool
附加了一些特殊功能的变量。这就是为什么它使用=
符号来定义它的值。
约束模板意味着如果违反约束,则该模板定义不存在。
所以给定template<A T> concept B
,B
when的值A<T>
是false
多少?根据正常的 C++ 模板约束规则,它没有。实际上,如果您尝试使用这种类型实例化它,该变量甚至都不存在。
所以根本不是同一个意思。
推荐阅读
- javascript - 将文档保存到 mongoDB 以防止重复
- maven - intelliJ“加载 maven 更改”与 maven 生命周期
- c++ - C++ 有助于理解低级代码的语法
- oauth-2.0 - 在 Postman 的 Jmeter 中添加 Auth2.0 以生成 Token
- sql - 对多列的唯一约束是否在每列上创建索引
- javascript - 反应组件:如何从道具中设置仅键属性?
- android-studio - Android Studio Room 查询以获取随机的 db 行并将第 2 列的行保存在变量中
- ios - 如何在 Xcode 中修复这个颤动的 iOS 错误?
- css - 如何防止 div 的文本扩展表单宽度?
- documentation - 记录文件命名约定