TITLE: Overloading eliminates sequence points [ Adapted from "C++ Gotchas", tutorial notes by Tom Cargill, p. 43 Note that this particular problem is currently being examined by the WG21 committe. ] Consider expressions of the form left || right If || is the built-in operator, it acts as a "sequence point." In other words, "left" is completely evaluated (including all side effects), then if "left" is 0, "right" is evaluated. Consider the following example, x++ || y[x]++ If the left side is non-zero, the right side is not evaluated, therefore there is no side effect from the right side. If the left side is zero, the right side is evaluated, but the left side is fully evaluated, including all side effects, before the right side evaluation begins. If || is an overloaded operator, there is no sequence point. The expression left || right is equivalent to operator|| (left, right) or, if || is a member operator, left.operator|| (right) In both cases, as arguments to functions, the "left" and "right" are evaluated in an arbitrary, interleaved order.