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;
}
Était-ce utile?

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 .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top