Усилить лямбда недоумение - PullRequest
3 голосов
/ 20 марта 2009

Почему обратный вызов вызывается только один раз?

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

Ответы [ 2 ]

8 голосов
/ 20 марта 2009

Выражение || короткое замыкание после первого раза bind возвращает true.

При первой оценке

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

bind вызывается, потому что это единственный способ определить значение false || bind(...). Поскольку bind(...) возвращает true, result имеет значение true.

Каждый раз, когда вы говорите

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

... выражение bind(...) не вычисляется, потому что не имеет значения, что оно возвращает ; выражение true || anything всегда true, а выражение || короткое замыкание .

Один из способов гарантировать, что bind всегда вызывается, - переместить его в левую часть || или изменить || на &&, в зависимости от того, что вы пытаетесь выполнить result.

1 голос
/ 20 марта 2009

В вашем конкретном примере Boost.Lambda ничего вам не дает. Избавьтесь от лямбда-частей, и, возможно, вы увидите более ясно, что происходит:

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

Это все еще зависит от вас, чтобы знать, что оператор || закорочен, как объяснил Даниэль .

...