为什么我不能约束一个概念

Why can't I constrain a concept

不允许限制这样的概念:

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,当 A<T>false 时,B 的值是多少?根据正常的 C++ 模板约束规则,它没有。实际上,如果您尝试使用这种类型实例化变量,则该变量甚至 不存在

所以完全不是同一个意思