给定两个explicit
构造函数重载(基于不同std::function<...>
的类型),返回值std::bind
可以选择其中一个(从而使调用不明确)
call of overloaded ‘Bar(std::_Bind_helper<false, void (Foo::*)(int),
Foo*, int>::type)’ is ambiguous
如果我注释掉任何一个,那么代码就会编译!
我会认为让构造函数explicit
要么选择正确的重载,要么阻止两者都被选中?
当然,在我绑定的时候明确地创建一个:std::function
Bar b(std::function<void(int)>(std::bind((&Foo::process), &f, 1)));
但是,我很困惑为什么类型推导不起作用?
- 如果 from 的返回值
std::bind
都不匹配两个构造函数签名,则它们的事实explicit
应该防止两者都被选中。 - 如果 from 的返回值
std::bind
与两个构造函数签名之一匹配,则它们的事实explicit
应该会导致选择正确的一个。
这里实际发生了什么?
完整的工作代码如下:
#include <functional>
struct Foo
{
void process(int) { }
};
struct Bar
{
// comment out either of these to compile
explicit Bar(std::function<void(int)>) {}
explicit Bar(std::function<void(short)>) {}
};
int main()
{
Foo f;
Bar b(std::bind(&Foo::process, &f, 1));
return 0;
}