拒绝 lambda 表达式 (C++11)

lambda expression being rejected (C++11)

本文关键字:C++11 表达式 lambda 拒绝      更新时间:2023-10-16
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 定义了到函数指针的隐式转换。您的 lambda 表达式捕获其上下文是因为捕获默认& 。由于您的 lambda 不能是无状态的,因此您可以更改其他重载的参数类型

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

如果您的 lambda 不需要捕获上下文变量,则可以从捕获列表中删除&,并且转换将按预期工作

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 模式下,您将指定参数类型。

lambda 中的自动仅在 C++14 中允许。

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