9

有什么方法可以将一般要求子句应用于 lambda 仿函数的参数?

假设我有两个约束C1C2并且我想检查一个参数。我希望以下内容可以工作,因为函数允许使用类似的语法:

[](auto x) requires C1<decltype(x)> && C2<decltype(x)> {
    // ...
}

但这不会与 GCC 6 一起编译

4

1 回答 1

5

以我的拙见并基于概念 TS §5.1.4/c4 需要表达式 [expr.prim.req]Emphasis Mine):

requires-expression 应仅出现在概念定义 (7.1.7) 中,或出现在模板声明 (Clause 14) 或函数声明 (8.3.5) 的 requires-clause 中。

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

因此,

[](auto x) requires C1<decltype(x)> && C2<decltype(x)> {
    // ...
}

无效。

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

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

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

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

现场演示

于 2015-11-07T21:31:36.767 回答