Порядок оценки аргумента между связанными статическими вызовами функций - PullRequest
3 голосов
/ 17 января 2012

Мне любопытно, почему существует разница в порядке вычисления аргументов между связанными статическими функциями и функциями-членами. Из ответов на на этот вопрос я вижу, что не определено, каков порядок вычисления аргументов между такими вызовами функций. Возьмем, к примеру, следующий фрагмент:

#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 не обязан предоставлять такие предупреждения, чтобы он мог пропустить второе выражение, но именно это заставляет меня верить, что происходит что-то интересное.

Ответы [ 2 ]

2 голосов
/ 18 января 2012

Ваш код имеет неопределенное поведение, но я полагаю, вы это знаете. Также, Вы можете легко увидеть разницу в зависимости от флагов оптимизации. Но в этом случае одной из вероятных причин является то, что нестатические функции требуют три аргумента, включая результаты предыдущего вызова, где как статические функции требуют только два, а результаты предыдущего вызов игнорируется.

2 голосов
/ 17 января 2012

Нет причин.Как вы говорите, порядок не определяется языком.

Одна из причин использования порядка справа налево состоит в том, что функции с переменным числом параметров, например printf, всегда будут иметь первый параметр сверху,В противном случае это не имеет значения.

...