Мне любопытно, почему существует разница в порядке вычисления аргументов между связанными статическими функциями и функциями-членами. Из ответов на на этот вопрос я вижу, что не определено, каков порядок вычисления аргументов между такими вызовами функций. Возьмем, к примеру, следующий фрагмент:
#include <iostream>
class test {
public:
static test& chain_s(test& t, int i) {
std::cout << i << " ";
return t;
}
test& chain(test& t, int i) {
std::cout << i << " ";
return *this;
}
};
int main(int, char**) {
int x = 2;
test t;
t.chain(t,++x).chain(t,++x).chain(t,++x);
x = 2; std::cout << std::endl;
t.chain_s(t,++x).chain_s(t,++x).chain_s(t,++x);
return 0;
}
В случае GCC 4.6.2 и CL 15.00.30729.01 (MSVC 9) результирующий вывод для меня
5 5 5
3 4 5
Однако мне было интересно, есть ли какая-либо причина в спецификации или если иначе известно, почему статическая функция вычисляется слева направо (с их аргументами), и для нестатической функции все аргументы сначала (справа налево от того, что я видел в других тестах).
Причина, по которой я спрашиваю об этом, заключается в том, что я впервые заметил эту разницу в поведении, когда пытался получить похожее поведение в C (используя структуру и указатель на функцию), и потерпел неудачу. Я сильно подозреваю, что это некоторая оптимизация, реализованная как в GCC, так и в MSVC для функций-членов, но я надеюсь, что кто-то здесь может пролить немного света на это.
Изменить:
Я забыл упомянуть одну важную информацию, которая кажется мне странной: GCC будет предупреждать только о неуказанном поведении связанной не статической функции, но не статических функций:
a.cpp: In function 'int main(int, char**)':
a.cpp:18:45: warning: operation on 'x' may be undefined [-Wsequence-point]
GCC не обязан предоставлять такие предупреждения, чтобы он мог пропустить второе выражение, но именно это заставляет меня верить, что происходит что-то интересное.