Search code examples
c++operator-overloadingc++17coutoperator-precedence

What is run first inside a cout statement? (C++17)


Say for example I have a long statement like

cout << findCurrent() << "," << findLowest() << "," << findHighest() << "," << findThird()<<"\n";

would findCurrent() be run before findLowest() like logic dictates?


Solution

  • Since C++17 the functions are guaranteed to be called left-to-right, i.e. findCurrent() is called first, then findLowest() and so on.

    C++17 Standard references: [expr.shift]/4 (referring to the expression E1 << E2):

    The expression E1 is sequenced before the expression E2.

    [over.match.oper]/2: (describing overloaded operators)

    the operands are sequenced in the order prescribed for the built-in operator.

    [intro.execution]/15:

    An expression X is said to be sequenced before an expression Y if every value computation and every side effect associated with the expression X is sequenced before every value computation and every side effect associated with the expression Y.

    Link to cppreference summary


    Prior to C++17 the order of function calls was unspecified, meaning that they may be called in any order (and this order does not need to be the same on repeated invocations).