概念要求中的分歧

Disjunctions in a Concept requirement

本文关键字:      更新时间:2023-10-16

一个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() };
};
相关文章:
  • 没有找到相关文章