I'm messing around with new C++20 lambdas, it seems I can declare a lambda taking a non type template param, but then I'm not able to call it.
#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
}
I looked at the relevant paper here but it doesn't seem to mention the calling syntax in such a case.
Is explicitly passing template arguments at the lambda call site forbidden? It would be a disappointing limitation, as I thought the intention was to make lambdas able to do as much as templates.
Is explicitly passing template arguments at the lambda call site forbidden?
No, but the issue is you're not specifying the template argument for the right entity. Note that f
itself is not a template. It's an object of a non-templated type that contains a member operator()
that is templated.
So when you do:
f<true>(); // error
you are specifying the template argument for f
, but since f
is not a template, you get an error.
On the other hand, as you've observed, this call:
f.operator()<true>(); // ok
is fine, because you are specifying the template argument for f
's operator()
which is indeed a template.
Also, this issue has nothing to do with non-type template parameters for lambdas, the same thing would happen if it were a type template parameter as well.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With