2

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

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 个参数链接到第一个参数中的函数指针(因此构成其签名的一部分) - 在我看来,这是提升的内部问题::

我在谷歌搜索这个问题时找不到的文档和任何其他建议都没有说明只有具有相同参数类型的重载函数存在问题。因此,如果有人能确认我的猜测是正确的(并且暗示,为什么我的怀疑是错误的),我将不胜感激,在我开始依赖我的代码之前(可能是错误的)假设它是有效的。我担心的是编译器只是根据我不打算的推理来选择要绑定的函数,例如选择它遇到的第一个函数。

4

1 回答 1

3

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

于 2012-04-13T02:22:41.640 回答