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

时间:2014-08-26 03:19:18

标签: c++ templates lambda functor overloading

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来自另一个标题,其定义无关紧要。

2 个答案:

答案 0 :(得分:2)

只有无捕获的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 ...;
    });
}

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

答案 1 :(得分:0)

auto in lambdas只允许在C ++ 14中使用。

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