web-dev-qa-db-ja.com

boost :: bindと参照であるパラメーターを持つ関数

バインドをブーストするために参照パラメーターを渡すとき、それらのパラメーターは参照のように機能しないことに気づきました。代わりに、boostはメンバーの別のコピーを作成し、渡された元の変数は変更されません。

ポインタへの参照を変更すると、すべてが正常に機能します。

私の質問は:

参照を機能させることは可能ですか、または少なくとも参照パラメーターを使用しようとしたときにコンパイルエラーが発生する可能性はありますか?

29
Brian R. Bondy

bindのブーストドキュメント は、これにboost :: refとboost :: crefを使用できることを示しています。

36
Timo Geusch

バインドで使用されるメソッドが参照パラメーターを取るように宣言されている場合は常に、バインドパラメーターが参照によって渡されることを期待して、同様の問題が発生しました。ただし、そうではありません。メソッドの宣言方法に関係なく、バインドパラメーター(参照によって渡される)をboost :: ref()またはboost :: cref()で明示的にラップする必要があります。

例:

ClassA myClassAParameter
void Method(ClassA &param);

現在、次のバインディング:

callback = boost::bind(&Method, myClassAParameter);

実際にClassAオブジェクトのコピーを作成します(これは一時的な割り当てであり、呼び出されたメソッドは実際のオブジェクトの参照ではなくコピーへの参照であるため、参照を保持する必要がありますnotオブジェクトの)。

ただし、次のバインディング:

callback = boost::bind(&Method, boost::ref(myClassAParameter));

notコピーを作成しますが、referenceを使用してバインドオブジェクトを作成します。

7
DolphinDream