C++ 如何调用lambda模板?

C++ 如何调用lambda模板?,c++,lambda,variadic-templates,C++,Lambda,Variadic Templates,我能够使用gcc编译以下代码: template<typename... Pack> auto func(Pack... x) { return (x + ...) ; } template<typename... Pack> auto lamd = [](Pack... x) { return (x + ...) ; }; 模板 自动功能(打包…x){ 回报率(x+…); } 模板 自动lamd=[](组件…x){ 回报率(x+…); }; 我可以

我能够使用gcc编译以下代码:

template<typename... Pack>
auto func(Pack... x) {
    return (x + ...) ;
}

template<typename... Pack>
auto lamd = [](Pack... x) {
    return (x + ...) ;
};
模板
自动功能(打包…x){
回报率(x+…);
}
模板
自动lamd=[](组件…x){
回报率(x+…);
};

我可以使用
func(1,2,3)
调用函数模板,但在使用
lamd(1,2,3)
lamd(1,2,3)
调用lambda时会出现错误

对于lambdas,您可以使用
auto

auto lamd = [](auto... x) {
    return (x + ...) ;
};
由于C++20,您可以使用显式的模板参数列表,但是请注意,模板参数列表仍然与lambda的
操作符()一起使用,就像使用
自动
参数一样。e、 g

auto lamd = []<typename... Pack>(Pack... x) {
    return (x + ...) ;
};
auto-lamd=[](包…x){
回报率(x+…);
};
然后您可以将其称为
lamd(1,2,3)


没有lambda模板这样的东西。lambda表达式始终是唯一的新类型。特别是,它不是可用于实例化实际函数的模板

但是,lamdba提供的函数调用运算符可以是模板。您还可以免费获得语法:

auto lamd = [](auto... x) {
    return (x + ...) ;
};
请注意,C++2a将附带对通用lambda的额外支持和明确性,并允许您

auto lambda = []<typename...T>(T&& ...args) { /* ... */ };
autolambda=[](T&&…args){/*…*/};

但这并不影响您在这里面临的问题。

第二个定义是变量模板。它没有将lambda的
操作符()
定义为模板,而是将参数包用于
操作符()
的参数类型。生成的
操作符()
是实例化变量闭包类型的常规成员函数。这里没有模板参数推断

因此,当您编写
lamd
时,变量会得到一个带有
运算符()(int)
的闭包类型,而不是一个可以用3个整数调用的类型

如前所述,您可以改用通用lambda

在C++20中,如果需要命名和推导lambda的参数类型,可以使用以下语法:

auto lamd = []<typename... Pack>(Pack...) {}
auto lamd=[](包…{}

这将把操作符定义为模板,接受一个参数包,并为模板参数推断敞开大门。

您应该看到:它将是
lamd(1,2,3)
@Jarod42,这很聪明!)回答得好。只是好奇-我可以使用一个模板化的lambda吗?@Nujufas回答修改。