Boost ahurissement lambda
-
21-08-2019 - |
Question
Pourquoi est-callback appelé une seule fois?
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;
}
La solution
|| expression href="http://en.wikipedia.org/wiki/Short-circuit_evaluation" rel="nofollow noreferrer"> circuits courts après le rendement du premier temps bind
.
La première fois que vous évaluez
result = result || bind(...) // result is false at this point
true
est appelé, parce que c'est la seule façon de déterminer la valeur de false || bind(...)
. Parce que les rendements bind(...)
result
, est réglé sur true || anything
&&
.
Toutes les autres fois que vous dites
result = result || bind(...) // result is true at this point
... l'expression n'est pas <=> évaluée, car elle n'a pas d'importance ce qu'il retourne ; l'expression est toujours <=> <=>, et les href="http://en.wikipedia.org/wiki/Short-circuit_evaluation" rel="nofollow noreferrer"> courts-circuits .
Une façon de veiller à ce que est toujours appelée <=> serait de se déplacer sur le côté gauche du <=>, ou changer le à un <=> <=>, selon ce que vous essayez d'accomplir avec <=>.
Autres conseils
Dans votre exemple particulier, Boost.Lambda ne vous gagne pas vraiment quoi que ce soit. Débarrassez-vous des parties lambda, et peut-être vous voir plus clairement ce qui se passe:
for (int i = 0; i < 10; ++i)
result = result || callback();
repose toujours sur vous de savoir que l'opérateur est à court ||
circuiter, comme Daniel explique .