带有模板参数的 Lambda 函数,而不是函数参数
Posted
技术标签:
【中文标题】带有模板参数的 Lambda 函数,而不是函数参数【英文标题】:Lambda functions with template parameters, not in function parameters 【发布时间】:2020-01-23 15:25:08 【问题描述】:为什么第一次调用没有编译?
auto get1 = []<int B>() return B; ;
auto get2 = []<typename B>(B b) return b; ;
int main()
get1<5>(); // error: no match for operator<
get2(5); // ok
我之所以使用这个,是因为一个表达式在代码中重复了很多次。
我当然可以使用真正的函数模板,但我只是好奇为什么。
【问题讨论】:
【参考方案1】:如果您考虑到您的get1
的等效类类型是什么样的,这将更容易理解:
struct get1_t
template <int B> operator()() const return B;
;
get1_t get1;
get1<5>(); // error
您正在尝试为调用运算符提供显式模板参数,但从语法上讲,您正在做的事情看起来像是为get1
本身提供模板参数(即,好像get1
是一个变量模板)。为了给呼叫操作员提供模板参数,你必须直接这样做:
get1.operator()<5>(); // ok
或重组呼叫操作员以采取可推论的方式:
template <int B> struct constant ;
get1(constant<5>);
或者将整个东西重新构造成看起来像它的变量模板:
template <int B>
auto get1 = [] return B; ;
现在,get1<5>
本身就是一个 lambda,您正在调用它。也就是说,我们有一个变量模板 lambda,它本身不是模板,而不是带有调用运算符模板的 lambda。
【讨论】:
@Bergi 和get1<5>()
是一回事以上是关于带有模板参数的 Lambda 函数,而不是函数参数的主要内容,如果未能解决你的问题,请参考以下文章