我有两个具有以下签名的重载成员函数:
class MyClass
{
void f(int, int, int);
void f(int, int, int, double);
};
我正在使用 boost::bind 如下:
boost::bind(&MyClass::f, _1, 1, 2, 3); // _1 is a placeholder for the implicit parameter
我的问题实际上是没有问题。根据 boost::bind 文档(在http://www.boost.org/doc/libs/1_49_0/libs/bind/bind.html#err_overloaded)这应该“通常”导致错误,我应该需要强制转换为函数指针类型。但是我的代码编译没有错误,并且似乎按预期运行。
文档中给出的示例是重载函数的唯一区别是一个是 const 而另一个不是。因此,我的猜测是我没有问题,因为编译器可以分辨出两个重载函数之间的区别,因为参数的数量(和类型)不同,而在文档的示例中没有办法编译器通过传递给 boost::bind 的参数来告诉你想要哪个版本。另一方面,我对我的猜测持怀疑态度,因为我质疑编译器如何知道在我的示例中传递给 boost::bind 的最后 3 个参数链接到第一个参数中的函数指针(因此构成其签名的一部分) - 在我看来,这是提升的内部问题::
我在谷歌搜索这个问题时找不到的文档和任何其他建议都没有说明只有具有相同参数类型的重载函数存在问题。因此,如果有人能确认我的猜测是正确的(并且暗示,为什么我的怀疑是错误的),我将不胜感激,在我开始依赖我的代码之前(可能是错误的)假设它是有效的。我担心的是编译器只是根据我不打算的推理来选择要绑定的函数,例如选择它遇到的第一个函数。