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

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 能够像模板一样做很多事情。

cig*_*ien 9

是否禁止在 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 的非类型模板参数无关,如果它也是类型模板参数,也会发生同样的事情。

  • @plexando:当“f”是一个值(不是模板)时,“f&lt;true&gt;(1)”已经意味着“(f&lt;true)&gt;1”。 (3认同)
  • 如果 lambda 本身,即函数对象,无法参数化,我想知道标准是否可以将 `f&lt;true&gt;()` 定义为 `f.operator()&lt;true&gt;( 的一种语法糖)`。 (2认同)