不允许这样约束一个概念:
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
如果第一个版本总是可以重写为第二个版本,为什么不允许第一个版本?
从功能设计的角度来看,用户不必在多个地方查找相同的信息。
A concept
对其模板参数定义了一系列约束。这些约束列在 =
之后符号;这就是他们的重点。因此,用户应该能够通过找到 =
来查看有关概念的所有信息。签名并查看其后的表达式。
您的方式意味着我最多需要查看三个地方:模板参数定义的约束、requires
模板头的子句(现在必须是可能的,因为这就是定义约束参数的方式),以及 =
之后的表达式签名。
当您可以正确拼写出来时,为什么还要为增加的复杂性而烦恼呢?代码阅读的次数多于编写的次数,因此我们应该偏向于更简单的阅读而不是方便的编写。
从特征定义的角度来看,一个concept
只是一个constexpr static bool
附加了一些特殊功能的变量。这就是它使用 =
的原因符号来定义它的值。
约束模板意味着如果违反约束,则此模板定义不存在。
所以给出template<A T> concept B
,B
的值(value)是多少?什么时候A<T>
是false
?根据正常的 C++ 模板约束规则,它没有。事实上,如果您尝试用这种类型实例化变量,该变量甚至不存在。
所以根本不是同一个意思