Подтвердить что ты не робот

Является ли следующее поведение undefined? я = func (i)

Я знаю, что i=i++; - это поведение undefined, потому что i изменяется дважды до точки последовательности ;.

Но я не знаю, гарантирует ли компилятор случай, как показано ниже: undefined:

int func(int &i)
{
    i++;
    return i;
}

int i = 1;
i = func(i);
4b9b3361

Ответ 1

Во-первых, современный С++ переключился с старой (неадекватной) концепции "точек последовательности" на новую концепцию "секвенирования" (т.е. "секвенирован до", "секвенирован после" ). Пока i = i++ по-прежнему undefined, i = ++i на самом деле отлично определен. Правила секвенирования во многих возвращающих lvalue операциях были переработаны.

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

Пример, иллюстрирующий защиту, предоставляемую вызовом функции, может выглядеть следующим образом

int inc(int &i) { return i++; }
...
int i = 1;

int r1 = i++ * i++ * i++;          
// Undefined behavior because of multiple unsequenced side effects
// applied to the same variable

int r2 = inc(i) * inc(i) + inc(i);
// No UB, but order of evaluation is unspecified. Since the result 
// depends on the order of evaluation, it is unspecified

int r3 = inc(i) + inc(i) + inc(i); 
// Perfectly defined result. Order of evaluation is still unspecified, 
// but the result does not depend on it