gpt4 book ai didi

c++ - 概念要求中的析取

转载 作者:搜寻专家 更新时间:2023-10-31 01:27:00 25 4
gpt4 key购买 nike

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

最佳答案

通过称为约束规范化 的过程,原子约束 的结合和析取将概念分解,如temp.constr.normal 所述。 .

仅:

  • 逻辑与 && ,
  • 逻辑或 || ,
  • 括号表达式 ()
  • 形式为C<A1, A2, ..., An>的id-expression ,其中 C 命名一个概念

分解。所有其他表达式都是原子约束

所以 require-expression 作为一个整体是一个原子约束。在概念TS中,require-expression被分解了,但在C++20中它们没有。据我所知,我只是阅读了c++委员会与概念相关的所有论文,原因是 require-expression 规范化可能会导致复杂度爆炸,从而降低编译速度。

所以:

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

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

关于c++ - 概念要求中的析取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54265361/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com