如何使用带有lambda仿函数参数的requires子句?

rni*_*ckb 9 c++ c++11 c++-concepts c++17

有没有办法将一般要求子句应用于lambda仿函数的参数?

假设我有两个约束条件C1,并C2说我要对参数进行检查.我希望以下内容能够正常工作,因为函数允许使用类似的语法:

[](auto x) requires C1<decltype(x)> && C2<decltype(x)> {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

但这不会与GCC 6 编译

101*_*010 5

以我的拙见和基于概念 TS§5.1.4/ c4要求表达式[expr.prim.req](强调我的):

requires-expression只能出现在概念定义(7.1.7)中,或出现在模板声明(第14条)或函数声明(8.3.5)的requires-clause中.

上面的引用特别规定了一个requires子句可以出现的上下文,而lambdas不是其中之一.

Concequently,

[](auto x) requires C1<decltype(x)> && C2<decltype(x)> {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

无效.

但是,在§5.1.2Lambda表达式[expr.prim.lambda]中有以下示例:

template<typename T> concept bool C = true;
auto gl = [](C& a, C* b) { a = *b; }; // OK: denotes a generic lambda
Run Code Online (Sandbox Code Playgroud)

所以我想,你可以通过以下方式完成你想要的任务:

template <class T> concept bool C1 = true;                                        
template <class T> concept bool C2 = true;
template <class T> concept bool C3 = C1<T> && C2<T>; // Define a concept that combines 
                                                     // `C1` and `C2` requirements.                   

int main() {                                                                      
  auto f = [](C3 x)  { /* Do what ever */ }; // OK generic lambda that requires input 
                                             // argument satisfy `C1` and `C2`                                                                                                                          
} 
Run Code Online (Sandbox Code Playgroud)

现场演示

  • `requires C1&lt;decltype(x)&gt; &amp;&amp; C2&lt;decltype(x)&gt; ` 是一个 *requires-clause*,而不是一个 *requires-expression*。 (2认同)