为什么它认为对以 std::function 作为参数的重载函数的调用是不明确的?

问题描述 投票:0回答:1

这是我尝试运行的代码。

#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 的函数会导致相同的错误。

c++ std-function
1个回答
1
投票

[]() -> 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()>

© www.soinside.com 2019 - 2024. All rights reserved.