这是我尝试运行的代码。
#include <functional>
int doFunc(std::function<void()> someFunc)
{
someFunc();
return 1;
}
int doFunc(std::function<bool()> someFunc)
{
someFunc();
return 2;
}
int main()
{
return doFunc([]() -> bool {return false;});
//return doFunc([](){});
}
当我尝试使用明确返回 bool 的 lambda 调用
doFunc()
时,编译器会抱怨:
<source>: In function 'int main()':
<source>:17:22: error: call of overloaded 'doFunc(main()::<lambda()>)' is ambiguous
17 | return doFunc([]() -> bool {return false;});
| ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
但是,当我传入一个明确返回
void
的lambda时,它成功打印出1。为什么它无法识别doFunc()
的正确版本?
我尝试创建一个函数并传递它而不是 lambda,我得到了相同的结果。传入 void 函数没问题,但传入返回 bool 的函数会导致相同的错误。
像
[]() -> bool
这样的 lambda 可以转换为 std::function<void()>
或 std::function<bool()>
,因为返回值可以被丢弃。
这就是为什么调用
doFunc([]() -> bool {return false;})
是不明确的。
另一方面,像
[](){}
这样的 lambda 无法转换为 std::function<bool()>
,因为它缺少返回值,因此调用没有二义性。
为了解决第一种情况的歧义,您可以将 lambda 分配给一个
std::function
变量:
std::function f = []() -> bool {return false; };
return doFunc(f);
编译器将被迫推断
std::function
的类型,并选择最接近 lambda 的类型,即:std::function<bool()>
。