我看到许多用 定义的“复合”概念的例子&&
,但没有在哪里||
使用。这让我想知道使用||
. 在我看来,使用||
将允许指定一个具有类似于重载(即临时多态性)效果的概念,但具有一组封闭的可能性。
对于一组“原始”概念 C1,...,CN,写成
C1 || ... || CN
作为“复合”概念?
我看到许多用 定义的“复合”概念的例子&&
,但没有在哪里||
使用。这让我想知道使用||
. 在我看来,使用||
将允许指定一个具有类似于重载(即临时多态性)效果的概念,但具有一组封闭的可能性。
对于一组“原始”概念 C1,...,CN,写成
C1 || ... || CN
作为“复合”概念?
约束
约束是指定模板参数要求的一系列逻辑操作。它们可以出现在 requires-expressions(见下文)中,也可以直接作为概念体出现。有 9 种类型的约束:
- 连词
- 析取
- 谓词约束
- 表达式约束(仅在需要表达式中)
- 类型约束(仅在 requires 表达式中)
- 隐式转换约束(仅在 requires 表达式中)
- 参数推导约束(仅在 requires 表达式中)
- 异常约束(仅在 requires 表达式中)
- 参数化约束(仅在需要表达式中)
和
析取
约束 P 和 Q 的分离被指定为 P || Q. 如果满足任一约束,则满足两个约束的分离。析取从左到右评估并短路(如果满足左约束,则不尝试将模板参数推导到右约束中)。用户定义的运算符重载|| 在约束析取中是不允许的。
您可以在约束中使用几乎任何常量表达式(包括||
)。唯一的限制是这些表达式必须返回bool
。
一种用途||
可能是定义已知共享公共接口的类型集。例如,积分 ( std::is_integral
) 可以定义为多个相同类型约束 ( is_same<T, int>
) 的析取。我不建议这样做。您应该以附加的方式定义概念。