The section of the ANSI/ISO C++ Standard dealing with program execution (1.9) also introduces sequence points.

C++ sequence points happen at the same places as C sequence points:
  • after a full-expression (i.e. an expression that is not a sub expression of another expression, or more succnctly stated, at every semicolon),
  • just after all of the arguments to a function call have been evaluated, and just before the function is called,
  • after the left operand of certain operators (&&, ||, ?:, ,) has been evaulated,
but adds a couple of other places:
  • Just *after* the return value from the function has been copied (possibly by a copy constructor), and just before expressions outside the function (such as a destructor call for some temporary value) are evaulated,
  • Just after a declaration invoking a constructor call with (),
    t_foo foo (bar, baz);
  • After each initializer at the beginning of a constructor definition.

    t_foo::t_foo (/*here*/t_bar ibar, t_baz ibaz): bar (ibar)/*here*/, baz (ibaz)/*here*/
    {
    //some stuff
    };
Notice that all of the above conditions could be interpreted as special cases of the sequence point conditions in C, but are a bit more precise because of things C++ adds.

Finally, the section of the C++ Standard dealing with expressions (5.4) also makes the prohibition against modifying the same lvalue twice without an intervening sequence point.

Source: International Standard ISO-IEC 14882, Programming Languages -- C++, published by the American National Standards Institute, © 1998 Information Technology Industry Council.