Усилить лямбда недоумение

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

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 ответа

Решение

|| Выражение коротких замыканий после первого раза 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,

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

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

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

Другие вопросы по тегам