【问题标题】:How to use a requires clause with lambda functor arguments?如何使用带有 lambda 仿函数参数的 requires 子句?
【发布时间】:2015-11-07 20:17:02
【问题描述】:

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

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

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

但是这个won't compile 使用 GCC 6

【问题讨论】:

  • 你为什么不写一个普通的函子?
  • Concepts TS 不会修改 lambda 的语法,所以我认为不可能将 requires 子句附加到 lambda。通过改变 simple-type-specifier 的定义,它允许使用 constrained-type-specifiers 作为参数。

标签: c++ c++11 c++17 c++-concepts


【解决方案1】:

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

需求表达式只能出现在概念定义(7.1.7)中,或模板声明的需求子句中 (第 14 条)或函数声明 (8.3.5)。

上面的引用特别说明了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`                                                                                                                          
} 

Live Demo

【讨论】:

  • 是的,看起来确实如此。我在概念组上找到了这个线程,它解决了相同的question。不幸的是,在很多情况下,简洁的概念语法不足以表达所需的约束。希望这将在未来的草案中得到解决。
  • 对 - 我知道简洁的概念语法。如果你有一个更复杂的 requires 子句,它仍然是 IMO 的一个缺陷,你必须定义一个全新的概念。此外,如果您有一个需要引用多个参数的概念,则该语法将不起作用。
  • @rnickb 根据您发布的链接,它不在 Adrew Shutton 的优先级列表中“使 lambdas 更大在我们的优先级列表中并不高(lambdas 应该使代码更短)。”。我有点同意。 Lambda 确实应该使代码更短。另一方面,您所说的是真实的,概念组合来完成您想要的,有点混淆了代码库。我想我们将来会看到会发生什么:)。
  • requires C1&lt;decltype(x)&gt; &amp;&amp; C2&lt;decltype(x)&gt; requires-clause,而不是 requires-expression
猜你喜欢
  • 1970-01-01
  • 2013-12-04
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 2019-03-31
  • 2015-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多