我有以下功能:
template <typename Range>
Range FindFirstIf(Range rng, bool (*Function)(typename Range::ConstReference value))
对于这个函数,我尝试传递一个像这样的 lambda 函数:
rng = FindFirstIf(rng, [](const float& val) { return (v < 0.0f); });
哪里rng
是浮点列表的范围,所以 Range::ConstReference
定义为const float&
我的编译器(gcc)提示类型不匹配
C:\Programming\Collections\main.cpp|24|note: mismatched types 'bool (*)(typename Range::ConstReference)' and 'main(int, char**)::< lambda(const float&) >'|
谁能告诉我我的代码有什么问题吗?
编辑:
当我传递这样的函数时,它会起作用:
bool (*func)(const float& v) = [](const float& v) { return v < 0.0f; };
当我尝试使用 auto 关键字时,问题与之前相同:
auto func = [](const float& v) { return v < 0.0f; };
最佳答案
我怀疑您的代码中存在 type-o,或者您使用的 gcc 版本未完全实现 lambda(或可能两者都实现)。
如果您的示例是:
[](const float& val) { return (val < 0.0f); }
(v -> val)
并且如果 Range::ConstReference
是 const float&
,则代码是合法的 C++11。
这里棘手的部分是一些 lambda 会隐式转换为函数指针。也就是说,那些没有 lambda-capture 的 lambda 将转换为具有相同签名的函数指针。
这个:
template <class Range>
Range
FindFirstIf(Range, bool (*Function)(typename Range::ConstReference value));
struct range
{
using ConstReference = const float&;
};
int
main()
{
range rng;
rng = FindFirstIf(rng, [](const float& val) { return (val < 0.0f); });
}
为我编译。
稍微研究一下在线 gcc 编译器,这似乎是 gcc 4.8 中的一个错误,已在 4.9 中修复。
关于c++ - Lambda 函数作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25703240/