规范化约束时,requires 表达式是一个原子吗?

Is a requires expression an atom when normalizing constraints?

我想确保我正确理解约束规范化过程,因为 cppreference 在这个主题上有点模糊。

似乎在规范化过程中,requires 表达式内部的任何内容始终被视为原子,无论 specific/complex.

这似乎得到了以下不同处理的支持:

template<typename T>
concept Decrementable = requires(T t) { --t; };

template<typename T>
concept RevIterator = Decrementable<T> && requires(T t) { *t; };

template<typename T>
concept RevIterator2 = requires(T t) { --t; *t; };

其中 Decrementable < RevIteratorDecrementableRevIterator2 未排序。

所以,这是正确的吗?或者有人可以指出标准中讨论此问题的特定部分吗?

rules of constraint expression normalization 自上而下地递归执行。如果一个表达式不是两个表达式的 conjunction/disjunction ,不是括号表达式,也不是概念名称,那么它是一个原子约束表达式。 requires 表达式不是这些异常之一,因此它是原子约束表达式。

是的,你的理解是正确的。为了包含(用 < 表示)发生,约束表达式的正常形式之间必须存在某种关系。如果检查约束规范化过程:

[temp.constr.normal]

1 The normal form of an expression E is a constraint that is defined as follows:

  • The normal form of an expression ( E ) is the normal form of E.
  • The normal form of an expression E1 || E2 is the disjunction of the normal forms of E1 and E2.
  • The normal form of an expression E1 && E2 is the conjunction of the normal forms of E1 and E2.
  • The normal form of a concept-id C<A1, A2, ..., An> is the normal form of the constraint-expression of C, after substituting A1, A2, ..., An for C's respective template parameters in the parameter mappings in each atomic constraint. If any such substitution results in an invalid type or expression, the program is ill-formed; no diagnostic is required.
    [ ... ]
  • The normal form of any other expression E is the atomic constraint whose expression is E and whose parameter mapping is the identity mapping.

人们看到逻辑 AND 表达式、逻辑 OR 表达式和概念 ID 是唯一被“分解”的表达式。每一种其他类型的表达式几乎都形成了自己的原子约束,包括 requires 表达式,如 requires(T t) { --t; *t; }.