Ответ 1
Точный момент времени, в который были уничтожены параметры, неуказан:
CWG решил не указывать, уничтожены ли объекты параметров сразу после вызова или в конце полного выражения, к которому принадлежит вызов.
Порядок, в котором строятся параметры, также не указан, но поскольку функциональные параметры имеют масштаб блока, хотя их порядок построения не указан, разрушение происходит в обратном порядке построения. Например. Рассмотрим
#include <iostream>
struct A {
int i;
A(int i) : i(i) {std::cout << i;}
~A() {std::cout << '~' << i;}
};
void f(A, A) {}
int main() {
(f(0, 1), std::cout << "#");
}
печатает 10#~0~1
с GCC и 01#~1~0
с Clang; они строят параметры в разных порядках, но оба они уничтожаются в обратном порядке построения, в конце полного выражения происходит вызов (а не справа после возвращения к вызывающей стороне). VС++ печатает 10~0~1#
.