【发布时间】:2020-02-25 20:31:04
【问题描述】:
鉴于 lambda 的类型是可确定的(可转换为 std::function(如果我错了,请纠正我),重载函数应该同时包含两个函子。
问题是:尽管明确定义了 lambda 类型,为什么下面会出现编译错误? ([&]() -> Type {})
请注意,对于我当前的解决方案,我需要按引用捕获, 这就是代码包含它的逻辑的原因。
下面的例子描述了这个问题:
#include <iostream>
#include <string>
#include <functional>
void do_some(std::function<void(int)> thing)
{
thing(5);
}
void do_some(std::function<bool(int)> thing)
{
if (thing(10))
{
std::cout << "it's true!" << std::endl;
}
}
int main()
{
int local_to_be_modified = 0;
do_some(
[&](int in)
{
local_to_be_modified = in;
std::cout << "This is void-" << std::endl;
}
);
do_some(
[&](int in) -> bool
{
// error: call to 'do_some' is ambiguous
local_to_be_modified += in;
std::cout << "This is bool-" << std::endl;
return true;
}
);
}
【问题讨论】:
-
因为
std::function<void(int)>甚至可以从返回某些内容的 lambda 构造(这会导致返回值被忽略)。 -
顺便说一句,明确指定该 lambda 的返回类型完全没有任何作用。
标签: c++ c++11 lambda implicit-conversion std-function