30

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

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

私の質問は:

参照を取得することは可能ですか、または参照パラメーターを使用しようとすると少なくともコンパイルエラーが発生しますか?

4

2 に答える 2

38

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

于 2009-01-22T17:22:36.533 に答える
7

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

例:

ClassA myClassAParameter
void Method(ClassA &param);

今、次のバインディング:

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

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

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

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

はコピーを作成しませんが、参照を使用してバインド オブジェクトを作成します。

于 2014-01-13T18:18:14.433 に答える