Оценка параметров и неопределенное поведение - PullRequest
2 голосов
/ 05 мая 2011

Учитывая этот пример (который является упрощением примера в документации для boost :: multi_index_container об откате обновления):

#include <iostream>

struct change
{
        int val_;
        change(int const &val) : val_(val)
        {
        }

        void operator() (int &v) const
        {
                v = val_;
        }
};

void do_it(int &v, change const &c1, change const &c2)
{
        c1(v);
        c2(v);
}

main()
{
        int i = 17;
        int orig = i;
        do_it(i, change(11), change(orig));
        std::cout << "i = " << i << std::endl;
}

Нужна ли здесь явная копия iorig)? Или это может быть проще записать как:

        int i = 17;
        do_it(i, change(11), change(i));

В таком случае, будет ли гарантировано значение i после вызова do_it равным 17? Оба параметра change необходимо построить до выполнения тела функции.

Гарантирует ли язык, что все параметры будут созданы до начала функции? (Если нет гарантии, то компилятор может отложить создание c2 до тех пор, пока не будет запущен c1 s operator(), и, таким образом, окончательное значение будет 11)

1 Ответ

4 голосов
/ 05 мая 2011

Все параметры для вызова функции оцениваются перед вызовом функции. Порядок, в котором оцениваются параметры, не указан.

В вашем случае i все равно будет 17.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...