我正在弄乱新的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
}
我在这里查看了相关的文章,但在这种情况下似乎没有提及调用语法。
是否在lambda调用站点上显式传递模板参数?这将是一个令人失望的限制,因为我认为这样做的目的是使Lambda能够执行与模板一样的工作。
是否在lambda调用站点上显式传递模板参数?
否,但是问题是您没有为正确的实体指定模板参数。请注意,f
它本身不是模板。它是非模板类型的对象,其中包含operator()
已模板化的成员。
因此,当您这样做时:
f<true>(); // error
您为指定了模板参数f
,但由于f
它不是模板,因此会出现错误。
另一方面,如您所见,此调用:
f.operator()<true>(); // ok
是好的,因为你指定的模板参数f
的operator()
这的确是一个模板。
另外,此问题与lambda的非类型模板参数无关,如果它也是类型模板参数,也会发生相同的情况。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句