2009-03-19 13 views
3

なぜコールバックは一度だけ呼び出されますか?ラムダ募集

bool callback() 
{ 
    static bool res = false; 
    res = !res; 
    return res; 
} 

int main(int argc, char* argv[]) 
{ 
    vector<int> x(10); 

    bool result=false; 
    for_each(x.begin(),x.end(),var(result)=var(result)||bind(callback)); 

    return 0; 
} 

答えて

8

bind戻りtrue最初時間後||short circuits

ことがfalse || bind(...)の値を決定する唯一の方法だからあなたが

result = result || bind(...) // result is false at this point 

bindを評価する最初の時間は、と呼ばれています。 bind(...)trueを返しますので、resulttrueに設定されています。

他のすべての時間はあなたが言う

を返すかは重要ではありませんので、bind(...)式は、評価されません

result = result || bind(...) // result is true at this point 
...。 true || anythingは常にtrue||short circuitsとなります。 bindが常に呼ばれることを保証する

一つの方法は、||の左側に移動するか、resultで達成しようとしているかに応じて、&&||を変更することです。

+0

Boost.Lambdaの演算子|| bind()が返すfunctorオブジェクトの遅延実行能力と併せて短絡するように特別に設計されています。通常の過負荷演算子||短絡しないでください。 –

+0

ええ、それはそれの素晴らしい特徴です。通常、演算子のオーバーロードが発生すると、短絡が発生しません。ブーストラムダはそれを世話しているようだ。 –

1

特定の例では、Boost.Lambdaは実際には何も得られません。ラムダ部品を取り除く、そして多分あなたは何が起こっているかをより明確にわかります。

for (int i = 0; i < 10; ++i) 
    result = result || callback(); 

これはまだDaniel explainedとして、||オペレータが短絡していることを知っているあなたに依存しています。

関連する問題