首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++20模板lambas的限制与使用

C++20模板lambas的限制与使用
EN

Stack Overflow用户
提问于 2020-01-04 15:28:29
回答 2查看 442关注 0票数 8

C++标准专家的几个相关问题。

传入的C++20 介绍模板lambdas (P0428R2)。

所以而不是

代码语言:javascript
复制
auto x = [](auto x, auto y){ return x+y; };

我们可以如下所示指定模板参数

代码语言:javascript
复制
auto x = []<typename T>(T x, T y){ return x+y; };

到现在为止还好。

第一个问题:在模板lambdas中,显式模板参数只能从参数中推断,还是可以添加非推导的模板参数?

阅读P0428r1我没有看到任何明确的限制,但我也没有看到非推导模板参数的例子。

在第一种近似下,我假设没有推导的模板参数是合法的,因为我看到了以下愚蠢的代码

代码语言:javascript
复制
int main()
 {   
   []<int = 0>(){ }();
 }

编译并运行g++ (10.0.0head)和clang++ (10.0.0head)。

假设允许使用非推导的模板参数,那么第二个问题是:如何在提供模板参数的同时调用模板lambda?

通过示例:给定以下模板lambda

代码语言:javascript
复制
auto x = []<std::size_t I>(auto t){ return std::get<I>(t); };

在不显式命名I的情况下调用此类lambda时,是否有指定模板参数operator()的语法?

我试过了

代码语言:javascript
复制
x<0u>(y);

但是<被解释为关系运算符。

我试过简单地添加template

代码语言:javascript
复制
x template <0u>(y);

但不起作用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-04 16:07:24

在lambda函数中,对模板头没有特殊的限制。毕竟,Lambdas只是你在任何operator()重载下已经可以做的事情的缩写。

在调用lambda函数的operator()时,没有提供模板参数的特殊语法。如果您有没有导出的模板参数,则必须使用传统的机制来提供这些模板参数。艾莉:lamb.operator()<Args>(...)

票数 7
EN

Stack Overflow用户

发布于 2021-03-06 21:41:22

非推导的lambda模板参数是合法的。调用它们的语法类似于方法调用同一个类的重载运算符时所需的现有函数表示法;特别是当它是重载运算符模板时。

我在下面的示例中显示了最详细的组合,其中template关键字也是必需的,因为lambda有一个依赖的名称:

代码语言:javascript
复制
#include <tuple>

template <typename T>
void test()
{
  std::tuple tup{42, "eggs"};
  auto x = []<std::size_t I>(auto t){ return std::get<I>(t); };
  int i = x.template operator()<0>(tup);
}

int main(int argc, char *argv[])
{
  test<float>();
  return 0;
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59592122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档