具有非类型模板参数的C ++ 20 lambda

时间:2020-10-24 18:45:01

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

我正在弄乱新的C ++ 20 lambda,看来我可以声明一个接受非类型模板参数的lambda,但是后来我无法调用它。

#include <iostream>

int main() {

    // compiles fine
    auto f = []<bool ok>() { return ok; };

    // it even has an address??
    std::cout << &f;

    // f();    // error : no matching function for call to object of typ
    // f<true>(); // error : invalid operands to binary expression

    f.operator()<true>(); // compiles but somewhat... ugly
}

我看了相关的论文here,但在这种情况下似乎没有提及调用语法。

是否在lambda调用站点上显式传递模板参数?这是一个令人失望的限制,因为我认为这样做的目的是使lambda能够执行与模板一样的工作。

1 个答案:

答案 0 :(得分:9)

是否明确禁止在lambda调用站点传递模板参数?

否,但是问题是您没有为正确的实体指定模板参数。请注意,f本身不是模板。这是一个非模板类型的对象,它包含一个被模板化的成员operator()

因此,当您这样做时:

f<true>(); // error

您正在为f指定模板参数,但是由于f不是模板,因此会出现错误。

另一方面,如您所见,此调用:

f.operator()<true>();  // ok

很好,因为您正在为f的{​​{1}}指定模板参数,而这确实是模板。

此外,此问题与lambda的非类型模板参数无关,如果它也是类型模板参数,也会发生同样的事情。