Усилить лямбда недоумение
Почему обратный вызов вызывается только один раз?
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();
Это все еще зависит от вас, чтобы знать, что ||
оператор замкнут, как объяснил Даниэль.