【问题标题】:C++20 lambdas with non type template parameters具有非类型模板参数的 C++20 lambda
【发布时间】:2021-02-07 12:19:13
【问题描述】:

我在搞乱新的 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 能够像模板一样发挥作用。

【问题讨论】:

  • 一种可能性是直接在 lambda 中调用函数模板:f.operator()&lt;true&gt;();。不知道有没有别的办法。
  • @tkausl,很好,我没想到它可以工作 :)

标签: c++ templates lambda c++20


【解决方案1】:

是否禁止在 lambda 调用站点显式传递模板参数?

不,但问题是您没有为正确的实体指定模板参数。请注意,f 本身不是模板。它是一个非模板类型的对象,包含一个被模板化的成员operator()

所以当你这样做时:

f<true>(); // error

您正在为f 指定模板参数,但由于f 不是模板,您会收到错误消息。

另一方面,正如您所观察到的,这个调用:

f.operator()<true>();  // ok

很好,因为您正在为foperator() 指定模板参数,这确实是一个模板。

此外,这个问题与 lambda 的非类型模板参数无关,如果它也是类型模板参数也会发生同样的事情。

【讨论】:

  • 如果lambda本身,即函数对象,不能被参数化,我想知道f&lt;true&gt;()是否可以被标准定义为f.operator()&lt;true&gt;()的一种语法糖。
  • @plexando 我看不出任何不起作用的原因。但是,我认为这将是一个额外的规则,没有多大好处。
  • @plexando: f&lt;true&gt;(1) 已经意味着 (f&lt;true)&gt;1 f 是一个值(不是模板)。
  • @DavisHerring 好吧,就是这样 :) 我什至没有想到 :)
  • @Davis Herring::) 是的,(红色)Herring 先生。我一直想知道这背后是谁:link.
猜你喜欢
  • 2020-05-02
  • 1970-01-01
  • 1970-01-01
  • 2023-02-05
  • 1970-01-01
  • 2023-01-25
  • 2018-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多