Ни разу не эквиэвалентно! Одно -- два разных оператора (разделённых ';'). Другое -- два выражения вычисляемые в одном операторе. Результат в конкретном случае конечно одинаковый, но разница может быть: 1) Temporary objects are destroyed as the last step in evaluating the full-expression (1.9) that (lexically) contains the point where they were created...
2) A full-expression is an expression that is not a subexpression of another expression.
В выражении с запятой, где создаются временные объекты, они будут уничтожены по окончанию полного выражения (на точке с запятой), а не после первой запятой. Например, есть следующая программа:
#include <iostream>
using namespace std;
struct S {
S() { cout << "S()" << endl; }
~S() { cout << "~S()" << endl; }
};
int f() { cout << "f()" << endl; return 0; }
int main()
{
int x = ( S(), f(), 42 );
return x;
}
Эта программа даёт такой вывод:
S()
f()
~S()
Что демонстрирует, что S разрушается после вызова f. Т.е. оператор запятая конечно это sequence point, но не full expression end.
Может есть заковыристые случаи и следствия из того, что я говорю, но сходу не скажу.