C++标准专家的几个相关问题。
传入的C++20 介绍模板lambdas (P0428R2)。
所以而不是
auto x = [](auto x, auto y){ return x+y; };我们可以如下所示指定模板参数
auto x = []<typename T>(T x, T y){ return x+y; };到现在为止还好。
第一个问题:在模板lambdas中,显式模板参数只能从参数中推断,还是可以添加非推导的模板参数?
阅读P0428r1我没有看到任何明确的限制,但我也没有看到非推导模板参数的例子。
在第一种近似下,我假设没有推导的模板参数是合法的,因为我看到了以下愚蠢的代码
int main()
{
[]<int = 0>(){ }();
}编译并运行g++ (10.0.0head)和clang++ (10.0.0head)。
假设允许使用非推导的模板参数,那么第二个问题是:如何在提供模板参数的同时调用模板lambda?
通过示例:给定以下模板lambda
auto x = []<std::size_t I>(auto t){ return std::get<I>(t); };在不显式命名I的情况下调用此类lambda时,是否有指定模板参数operator()的语法?
我试过了
x<0u>(y);但是<被解释为关系运算符。
我试过简单地添加template
x template <0u>(y);但不起作用。
发布于 2020-01-04 16:07:24
在lambda函数中,对模板头没有特殊的限制。毕竟,Lambdas只是你在任何operator()重载下已经可以做的事情的缩写。
在调用lambda函数的operator()时,没有提供模板参数的特殊语法。如果您有没有导出的模板参数,则必须使用传统的机制来提供这些模板参数。艾莉:lamb.operator()<Args>(...)。
发布于 2021-03-06 21:41:22
非推导的lambda模板参数是合法的。调用它们的语法类似于方法调用同一个类的重载运算符时所需的现有函数表示法;特别是当它是重载运算符模板时。
我在下面的示例中显示了最详细的组合,其中template关键字也是必需的,因为lambda有一个依赖的名称:
#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;
}https://stackoverflow.com/questions/59592122
复制相似问题