[英]limits and uses of C++20 template lambas
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; };
到现在为止还挺好。
第一个问题:模板 lambda 中的显式模板参数是否只能从参数中推导出来,还是可以添加非推导出的模板参数?
阅读 P0428r1 我没有看到任何明确的限制,但是,我也没有看到非推导模板参数的例子。
在第一个近似值中,我认为非推导的模板参数是合法的,因为我看到以下愚蠢的代码
int main()
{
[]<int = 0>(){ }();
}
使用 g++(10.0.0 head)和 clang++(10.0.0 head)编译和运行。
假设允许非推导的模板参数,第二个问题是:如何在提供模板参数的同时调用模板 lambda?
通过示例:给定以下模板 lambda
auto x = []<std::size_t I>(auto t){ return std::get<I>(t); };
在调用此类 lambda 时是否有一些语法用于指定模板参数I
而不显式命名operator()
?
我试过
x<0u>(y);
但<
被解释为关系运算符。
我试过简单地添加template
x template <0u>(y);
但它不起作用。
lambda 函数中的模板头没有特殊限制。 Lambdas 毕竟只是你可以用任何operator()
重载做的事情的简写。
在调用 lambda 函数的operator()
时,没有用于提供模板参数的特殊语法。 如果您有未推导的模板参数,则必须使用传统机制来提供这些模板参数。 即: lamb.operator()<Args>(...)
。
非推导的 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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.