boost :: bind与重载函数?

时间:2012-04-13 02:13:35

标签: c++ boost

我有两个带有以下签名的重载成员函数:

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个参数链接到第一个参数中的函数指针(因此形成其签名的一部分) ) - 在我看来,这是boost :: bind的内部问题,编译器应该不知道。

我在搜索此问题时可以找到的文档或任何其他建议都没有指出只有具有相同参数类型的重载函数存在问题。所以,如果有人能够确认我的猜测是正确的(并暗示,为什么我的怀疑论是错误的),我会感激不尽,在我开始依赖我的代码(可能是错误的)假设它是有效的之前。我担心的是编译器只是根据我不想要的推理选择要绑定的函数。选择它遇到的第一个。

1 个答案:

答案 0 :(得分:3)

如果只有一个选择在语义上正确,那么你就没事了(就像在你的例子中)。如果有更多,不要猜测它会选择什么,选择它(如在boost的例子中) 由于绑定与c ++中的其他内容一样,是强类型的,因此编译器不能简单地缩小函数或其他内容,因此不会选择像在示例中选择第一个那样。