【问题标题】:Why can't I constrain a concept [duplicate]为什么我不能约束一个概念[重复]
【发布时间】:2020-04-18 17:29:32
【问题描述】:
不允许像这样约束一个概念:
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
如果第一个版本总是可以重写为第二个版本,那是什么原因不允许呢?
【问题讨论】:
标签:
c++
c++20
c++-concepts
【解决方案1】:
从功能设计的角度来看,用户不必在多个地方查找相同的信息。
concept 定义了一系列对其模板参数的约束。这些约束列在= 符号之后;这就是他们的重点。因此,用户应该能够通过找到= 符号并查看其后面的表达式来查看有关概念的所有信息。
您的方式意味着我将不得不查看最多三个地方:模板参数定义的约束,模板头的requires 子句(现在必须有可能,因为这就是约束参数的方式定义为工作),以及= 符号后面的表达式。
既然您可以正确地拼出它,为什么还要为增加的复杂性而烦恼呢?代码的阅读次数多于编写次数,因此我们应该倾向于更简单的阅读而不是方便的编写。
从功能定义的角度来看,concept 只是一个带有一些特殊功能的constexpr static bool 变量。这就是它使用= 符号来定义其值的原因。
约束一个模板意味着如果违反约束,这个模板定义不存在。
那么给定template<A T> concept B,当A<T> 是false 时B 的值是多少?根据正常的 C++ 模板约束规则,它没有。事实上,如果你尝试用这种类型实例化它,这个变量甚至都不存在。
所以根本不是同一个意思。