作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
给定两个 explicit
构造函数重载(基于不同的std::function<...>
类型),std::bind
的返回值能够选择任一个(从而使调用不明确)
call of overloaded ‘Bar(std::_Bind_helper<false, void (Foo::*)(int),
Foo*, int>::type)’ is ambiguous
如果我注释掉其中任何一个,代码就会编译!
我本来想制作构造函数 explicit
会选择正确的重载,还是会阻止两者都被选中?
当然显式创建std::function
在我绑定(bind)作品的时候:
Bar b(std::function<void(int)>(std::bind((&Foo::process), &f, 1)));
但是,我很困惑为什么类型推导不起作用?
std::bind
两个构造函数签名都不匹配,事实上它们是 explicit
应该防止两者都被选中。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;
}
最佳答案
制作构造函数explicit
与必须完全匹配的参数无关!使构造函数显式化的影响意味着它不会用于隐式转换类型为 Bar
的不同类型的对象。使用这个构造函数。但是,如果您尝试初始化 Bar
使用直接初始化的对象(即 Bar(x)
),将考虑两个构造函数。
std::bind()
的结果肯定不是 std::function<Signature>
,即它与您的任何一个构造函数都不完全匹配。因为有一个非 explicit
std::function<Signature>
的构造函数它适用于函数对象,两个签名都匹配:生成的绑定(bind)表达式不需要任何参数但它可以接受参数,即任何参数类型也不能用于区分 Bar
的两个构造函数中的哪一个。应该匹配。即使绑定(bind)表达式需要一个参数,我也不认为它会被用来优先选择一个构造函数而不是另一个构造函数。
关于c++ - std::bind 的返回类型可隐式转换为两个不同的显式构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18939107/
我是一名优秀的程序员,十分优秀!