我正在弄乱新的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能够执行与模板一样的工作。
答案 0 :(得分:9)
是否明确禁止在lambda调用站点传递模板参数?
否,但是问题是您没有为正确的实体指定模板参数。请注意,f
本身不是模板。这是一个非模板类型的对象,它包含一个被模板化的成员operator()
。
因此,当您这样做时:
f<true>(); // error
您正在为f
指定模板参数,但是由于f
不是模板,因此会出现错误。
另一方面,如您所见,此调用:
f.operator()<true>(); // ok
很好,因为您正在为f
的{{1}}指定模板参数,而这确实是模板。
此外,此问题与lambda的非类型模板参数无关,如果它也是类型模板参数,也会发生同样的事情。