【问题标题】:Lambda functions with template parameters, not in function parameters带有模板参数的 Lambda 函数,而不是函数参数
【发布时间】: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
}

我之所以使用这个,是因为一个表达式在代码中重复了很多次。

我当然可以使用真正的函数模板,但我只是好奇为什么。

【问题讨论】:

    标签: c++ templates lambda c++20


    【解决方案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;()是一回事
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-15
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 2012-05-03
    相关资源
    最近更新 更多