规范化约束时,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 < RevIterator
但 Decrementable
和 RevIterator2
未排序。
所以,这是正确的吗?或者有人可以指出标准中讨论此问题的特定部分吗?
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; }
.
我想确保我正确理解约束规范化过程,因为 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 < RevIterator
但 Decrementable
和 RevIterator2
未排序。
所以,这是正确的吗?或者有人可以指出标准中讨论此问题的特定部分吗?
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 ofE
.- The normal form of an expression
E1 || E2
is the disjunction of the normal forms ofE1
andE2
.- The normal form of an expression
E1 && E2
is the conjunction of the normal forms ofE1
andE2
.- The normal form of a concept-id
C<A1, A2, ..., An>
is the normal form of the constraint-expression ofC
, after substitutingA1
,A2
, ...,An
forC
'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; }
.