3

コールバックが1回だけ呼び出されるのはなぜですか?

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;
}
4

2 に答える 2

8

||式は、最初にが返された後に短絡します。bindtrue

初めて評価するとき

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

bindの値を決定する唯一の方法であるため、 が呼び出されますfalse || bind(...)bind(...)を返すためtrueresultに設定されtrueます。

あなたが言うたびに

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

...何を返すかは問題ではないためbind(...)式は評価されません。式true || anythingは常にtrueあり、||式は短絡します。

が常に呼び出されるようにする 1 つの方法は、 で達成しようとしていることに応じてbind、 の左側に移動するか、を に||変更することです。||&&result

于 2009-03-19T22:20:15.100 に答える
1

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

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

ダニエルが説明し||たように、これはオペレーターが短絡していることを知ることに依然依存しています。

于 2009-03-19T22:41:44.223 に答える