Порядок оценки вызовов функций не указан. Ваше первое выражение в основном сводится к следующему:
cout << a << b << c << d;
Каждый из a
, b
, c
и d
является вызовом Astack.Pop()
. Компилятор может генерировать код, который оценивает эти вызовы в любом порядке, который он выберет.
Вам следует избегать написания выражений, которые основаны на определенном порядке вычисления частей выражения. В общем, это небезопасно (и даже когда это безопасно, это обычно довольно запутанно).