概念要求中的分歧
Disjunctions in a Concept requirement
一个requires表达式通常看起来像:requires ( parameter-list(optional) ) { requirement-seq }
是否可以在不使用requires constraint-expr
的情况下,在序列中形成析取(||)作为需求。例如:
template<typename T> concept FooBarExpert =
requires(T a, T b) {
{a.foo(b)} || {a.bar(b)}; // Req 1
{ a.baz() }; // Req 2
// and onward
};
通过temp.constr.normal.中描述的名为约束规范化的过程,在原子约束的连接和分离中分解概念
仅:
- 逻辑和CCD_ 3
- 逻辑或CCD_ 4
-
带括号的表达式
()
- 和形式为
C<A1, A2, ..., An>
的id表达式,其中C命名一个概念
被分解。所有其他表达式都是原子约束。
因此,require表达式作为一个整体,是一个原子约束。在概念TS中,需要表达式被分解,但在C++20中它们不是据我所知,我刚刚阅读了c++委员会所有与概念相关的论文,原因是需要表达式规范化可能会导致复杂性爆炸,从而影响编译速度
因此:
requires(T a, T b) {
requires requires(T a, T b){a.foo(b)}
|| requires(T a, T b){a.bar(b)}; // Req 1
{ a.baz() }; // Req 2
// and onward
};
是原子约束。和
requires(T a, T b) {
{a.foo(b)}
{ a.baz() }; // Req 2
// and onward
}
|| requires(T a, T b) {
{a.bar(b)}
{ a.baz() }; // Req 2
// and onward
};
是两个原子约束的析取。(两个需要表达式)
最后:
( requires(T a, T b) { a.foo(b); } || requires (T a, T b) { a.bar(b); } )
&& requires(T a, T b) { a.baz(); /* and onward */};
是析取与原子约束的结合。
将FooBarExpert
定义为适当的requires表达式的合取(或析取)。
template<typename T> concept bool FooBarExpert =
( requires(T a, T b) {
{ a.foo(b) };
} ||
requires(T a, T b) {
{ a.bar(b) };
}
) &&
requires(T a, T b) {
{ a.baz() };
};
相关文章:
- 没有找到相关文章