【问题标题】:lambda expression being rejected (C++11)lambda 表达式被拒绝 (C++11)
【发布时间】:2014-08-26 03:19:17
【问题描述】:
virtual Answer<const Taaal& const> askWho(bool(const Taaal& const)) = 0;
virtual Answer<const Taaal& const> askWho(const Taaal& const t) {
    return askWho([&](auto q) {
        return q == t;
    });
}

因为“没有重载函数的实例与参数列表匹配”而被拒绝(此外,我被告知 auto 是不允许的,但用显式类型替换它会留下第一个问题)

Taaal 是声明这些方法的(抽象)类。答案是#included 来自另一个标头,它的定义无关紧要。

【问题讨论】:

  • 函数指针应该如何存储 lambda 的状态?提示:不能。
  • auto lambda 中的参数将在 C++14 中可用,而不是在 C++11 中。
  • 将 auto 更改为 const Taaal&amp; const 仍然存在第一个问题,所以为了简洁起见,我在帖子中这样写。
  • @chris:你几乎总是在 cmets 中回答问题。你为什么不写一个答案并得到我的支持?
  • @Nawaz,如果这是一个答案,我会觉得不得不花时间充实它而不是去睡觉:/

标签: c++ templates lambda functor overloading


【解决方案1】:

只有无捕获的 lambda 定义了到函数指针的隐式转换。由于捕获默认值&amp;,您的 lambda 表达式会捕获其上下文。由于您的 lambda 不能是无状态的,您可以更改其他重载的参数类型

virtual Answer<const Taaal&> askWho(std::function<bool(const Taaal&)>) = 0;

如果您的 lambda 不需要捕获上下文变量,您可以从捕获列表中删除 &amp;,并且转换会按预期进行

virtual Answer<const Taaal&> askWho(const Taaal& t) {
    return askWho([](auto q) {
//                ^^ - nothing here
        return ...;
    });
}

请注意,lambda 的 auto q 参数类型仅在您以 C++14 模式编译代码时才有效(在 gcc 和 clang 上为 -std=c++1y)。在 C++11 模式下,您需要指定参数类型。

【讨论】:

    【解决方案2】:

    lambda 中的 auto 仅在 C++14 中允许。

    您必须使用实参数类型,C++11 中不包含多态 lambda。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      相关资源
      最近更新 更多