为什么我不能约束一个概念
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++ 模板约束规则,它没有。实际上,如果您尝试使用这种类型实例化变量,则该变量甚至 不存在 。
所以完全不是同一个意思
不允许限制这样的概念:
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++ 模板约束规则,它没有。实际上,如果您尝试使用这种类型实例化变量,则该变量甚至 不存在 。
所以完全不是同一个意思