带有模板参数的 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&lt;5&gt; 本身就是一个 lambda,您正在调用它。也就是说,我们有一个变量模板 lambda,它本身不是模板,而不是带有调用运算符模板的 lambda。

【讨论】:

@Bergi 和get1&lt;5&gt;()是一回事

以上是关于带有模板参数的 Lambda 函数,而不是函数参数的主要内容,如果未能解决你的问题,请参考以下文章

带有 lambda 作为每个实例化的唯一默认参数的模板

具有在编译时确定的参数数量的 Lambda 函数

将 lambda 作为模板参数传递给函数指针函数模板化

Lambda 函数调用函数模板参数的静态函数失败

C ++ lambda作为函数的模板参数不起作用

带有putrecord的lambda函数的AWS firehose delievery流