Рассмотрим следующую С++ стандартную ISO/IEC 14882: 2003 (E) цитату (раздел 5, пункт 4):
За исключением тех случаев, когда отмечено, порядок оценка операндов отдельных операторов и подвыражений отдельных выражения и порядок в какие побочные эффекты имеют место, является неопределенные. 53) Между предыдущими и следующая точка последовательности - скаляр объект должен иметь сохраненное значение не более чем один раз оценка выражения. Кроме того, предыдущее значение должно быть доступ только для определения значения для хранения. Требования этого пункт должен быть соблюден для каждого допустимый порядок подвыражения полного выражения; в противном случае поведение undefined. [Пример:
i = v[i++]; // the behavior is unspecified i = 7, i++, i++; // i becomes 9 i = ++i + 1; // the behavior is unspecified i = i + 1; // the value of i is incremented
-end пример]
Я был удивлен, что i = ++i + 1
дает значение undefined i
.
Кто-нибудь знает о реализации компилятора, которая не дает 2
для следующего случая?
int i = 0;
i = ++i + 1;
std::cout << i << std::endl;
Дело в том, что operator=
имеет два аргумента. Первый всегда является ссылкой i
.
В этом случае порядок оценки не имеет значения.
Я не вижу никаких проблем, кроме С++ Standard taboo.
Пожалуйста,, не учитывайте такие случаи, когда порядок аргументов важен для оценки. Например, ++i + i
, очевидно, undefined. Пожалуйста, подумайте только о моем случае
i = ++i + 1
.
Почему стандарт С++ запрещает такие выражения?