Thr*_*r57 4 c++ lambda templates 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
}
Run Code Online (Sandbox Code Playgroud)
我在这里查看了相关论文,但似乎没有提到这种情况下的调用语法。
是否禁止在 lambda 调用站点显式传递模板参数?这将是一个令人失望的限制,因为我认为目的是让 lambda 能够像模板一样做很多事情。
是否禁止在 lambda 调用站点显式传递模板参数?
不,但问题是您没有为正确的实体指定模板参数。请注意,f它本身不是模板。它是包含operator()模板化成员的非模板化类型的对象。
所以当你这样做时:
f<true>(); // error
Run Code Online (Sandbox Code Playgroud)
您正在为 指定模板参数f,但由于f不是模板,您会收到错误消息。
另一方面,正如您所观察到的,这个调用:
f.operator()<true>(); // ok
Run Code Online (Sandbox Code Playgroud)
很好,因为您正在为f's指定模板参数,operator()这确实是一个模板。
此外,此问题与 lambda 的非类型模板参数无关,如果它也是类型模板参数,也会发生同样的事情。
| 归档时间: |
|
| 查看次数: |
134 次 |
| 最近记录: |