requires expression通常看起来像: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
};
答案 0 :(得分:2)
将fixture ('Init Tests')
.page('http://devexpress.github.io/testcafe/example/');
test('Check Initial pg', async (t) => {
await t.expect(Selector('title').innerText).eql('XXXXXXX');
});
定义为适当的require表达式的合取(或析取)。
FooBarExpert
答案 1 :(得分:1)
通过temp.constr.normal中所述的约束归一化过程,将 atomic-constraints 分解和分解在一起。
仅:
&&
,||
,()
C<A1, A2, ..., An>
的被分解。其他所有表达式都是 atomic约束。
因此, require-expression 总体上是一个原子约束。在TS概念中, require-expression 被分解了,但是在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-expression )
最后:
( 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 */};
是析取与原子约束的结合。