我能够使用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)定义为模板,接受参数包,并为模板参数推导打开大门。

10-04 21:53
查看更多