概念要求中的析取

时间:2019-01-19 08:35:47

标签: c++ c++-concepts c++20

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
}; 

2 个答案:

答案 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>
  • id表达式,其中C命名了一个概念

被分解。其他所有表达式都是 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 */};

是析取与原子约束的结合。