||
Der Ausdruck short circuits nach dem ersten Mal bind
kehrt true
.
Das erste Mal, wenn Sie bewerten
result = result || bind(...) // result is false at this point
bind
genannt wird, denn das ist der einzige Weg, um den Wert von false || bind(...)
zu bestimmen. Weil bind(...)
true
zurückgibt, wird result
auf true
festgelegt.
Jedes anderes Mal, wenn Sie sagen
result = result || bind(...) // result is true at this point
... der bind(...)
Ausdruck nicht ausgewertet, weil es spielt keine Rolle, was es gibt; der Ausdruck true || anything
ist immer true
und der ||
Ausdruck short circuits.
Ein Weg, um sicherzustellen, dass bind
immer wäre genannt wird, es auf die linke Seite des ||
, sich zu bewegen oder die ||
zu einem &&
ändern, je nachdem, was Sie mit result
versuchen zu erreichen.
Und das ist wegen Boost.Lambda Operator || ist speziell entworfen, um in Verbindung mit der verzögerten Ausführungsfähigkeit des funktor-Objekts, das bind() zurückgibt, kurzzuschließen. Ein gewöhnlicher überladener Operator || schließt NICHT kurz. –
ja, das ist eine nette Eigenschaft davon. normalerweise, wenn Sie den Operator || überlasten, kommt es nicht zu einem Kurzschluss. Boost Lambda scheint sich darum zu kümmern. –