为什么我不能限制一个概念

cig*_*ien 4 c++ c++-concepts c++20

不允许这样约束一个概念:

template<typename T>
concept A = expr_1;

template<A T>
concept B = expr_2;   // error
Run Code Online (Sandbox Code Playgroud)

然而,似乎总是可以达到相同的结果,如下所示:

template<typename T>
concept A = expr_1;

template<typename T>
concept B = A<T> && expr_2;   // ok
Run Code Online (Sandbox Code Playgroud)

如果第一个版本总是可以重写为第二个版本,那么为什么不允许第一个版本呢?

Nic*_*las 7

从功能设计的角度来看,用户不必在多个位置查找相同的信息。

Aconcept对其模板参数定义了一系列约束。这些限制列在=符号后面;这就是他们的重点。因此,用户应该能够通过找到符号=并查看其后面的表达式来了解概念的所有内容。

你的方式意味着我必须查看最多三个地方:模板参数定义的约束、requires模板标头的子句(现在必须是可能的,因为这就是定义约束参数的工作方式),以及符号后面的表达式=

当你可以正确地拼出它时,为什么要为增加的复杂性而烦恼呢?代码的阅读次数多于编写次数,因此我们应该偏向于更简单的阅读而不是方便的编写。

从功能定义的角度来看,aconcept只是一个constexpr static bool附加了一些特殊功能的变量。这就是为什么它使用=符号来定义其值。

约束模板意味着如果违反约束,则该模板定义不存在。

那么, when istemplate<A T> concept B的值是多少?根据正常的 C++ 模板约束规则,它没有。事实上,如果您尝试使用这样的类型实例化该变量,该变量甚至不存在。BA<T>false

所以根本不是同一个意思。