我能够使用gcc编译以下代码:
template<typename... Pack>
auto func(Pack... x) {
return (x + ...) ;
}
template<typename... Pack>
auto lamd = [](Pack... x) {
return (x + ...) ;
};
我可以使用
func(1,2,3)
调用功能模板,但是在调用lamtda时使用lamd(1,2,3)
或lamd<int>(1,2,3)
会出现错误。 最佳答案
第二个定义是变量模板。它没有将lambda的operator()
定义为模板,而是采用operator()
的参数类型的参数包。生成的operator()
是实例化变量的闭包类型的常规成员函数。此处无法进行模板自变量推导。
因此,当您编写lamd<int>
时,变量将使用operator()(int)
获得闭包类型,而不是可通过3个整数调用的东西。
如前所述,您可以改用通用lambda。
在C++ 20中,如果需要命名和推导lambda的参数类型,则可以使用以下语法:
auto lamd = []<typename... Pack>(Pack...) {}
这会将运算符(operator)定义为模板,接受参数包,并为模板参数推导打开大门。