【发布时间】:2020-06-05 21:51:39
【问题描述】:
我定义了以下可变参数泛型 lambda 和重载的 foo() 函数。
template <typename Lambda>
auto bar(Lambda&& lambda) {
return [lambda = std::forward<Lambda>(lambda)](auto&& ...args) {
return lambda(std::forward<decltype(args)>(args)...);
};
}
void foo(std::function<void()>&& cmd, std::function<void()>&& callback) { std::cout << "void" << std::endl; }
void foo(std::function<bool()>&& cmd, std::function<bool()>&& callback) { std::cout << "bool" << std::endl; }
以下 3 个foo() 调用 print "void"。
int main()
{
// 1
foo(
bar( []() {} ),
bar( []() {} )
);
// 2
foo(
bar( []() { return true; } ),
bar( []() {} )
);
// 3
foo(
bar( []() {} ),
bar( []() { return true;} )
);
// 4) compiler error: foo is ambiguous
// foo(
// bar( []() { return false; } ),
// bar( []() { return true; } )
// );
}
能否请您帮我理解为什么它成功编译语句 1-3 但无法编译语句 4?
gcc 7.5.0
【问题讨论】:
-
我很好奇
bar是否有任何目的。这个例子似乎没有任何区别。我想这会迫使任何函子有一个占位符返回类型,但我想不出这可能会有所不同。 -
对,但是当我问这个问题时我并不清楚。