2

次のシグネチャを持つ 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 であり、他方がそうでないことです。したがって、引数の数 (および型) が異なるという事実により、コンパイラは 2 つのオーバーロードされた関数の違いを認識できるため、問題はないと思いますが、ドキュメントの例では、コンパイラを使用して、boost::bind に渡された引数から目的のバージョンを簡単に判断できます。一方、私の例でboost::bindに渡された最後の3つの引数が最初の引数の関数ポインターにリンクされている(したがって、その署名の一部を形成する)ことをコンパイラーがどのように知っているのか疑問に思うので、私は自分の推測に懐疑的です) - それはブーストの内部の問題であるように私には思えます::

この問題をグーグルで調べたときに見つけることができるドキュメントやその他のアドバイスは、同じ引数の型を持つオーバーロードされた関数にのみ問題があることを示していません。したがって、コードが有効であるという (おそらく間違っている) 仮定の下でコードに依存し始める前に、誰かが私の推測が正しいことを確認できれば (そして、暗示的に、私の懐疑論が間違っている理由) を確認できれば幸いです。私の懸念は、コンパイラが、最初に遭遇したものを選択するなど、意図しない推論に基づいてバインドする関数を単に選択していることです。

4

1 に答える 1