Недавно увидел мем, который скинут снизу о том, что i = i++ + 1 это про нарушения закона C++, и это на самом деле только отчасти правда. За этим стоит хорошая история.



Если коротко, то до C++17 это было undefined, то есть даже не то, чтобы в любом порядке это исполнялось, так вообще ничего не гарантировалось. В C++17 это сделали вполне себе defined behavior. Почему?



C++ стоит упрощать, по крайней мере так говорит Herb Sutter, глава комитета по C++, и он всё больше продвигает вещи, которые упрощают обучение людей. Теперь при любом операторе подразумевающим чёткое разделение на правую и левую части есть порядок. А именно



a.b

a->b

a(b1, b2, b3)

b @= a (@ любой из +, -, *, /, '')

a[b]

a << b << c << d

a >> b >> c >> d



Выполняются в порядке a, b, c, d всегда. Как удобно, теперь если Вы учите людей, то стоит говорить, что в таких интуитивных выражениях по типу равно выполняется сначала правая часть, потом левая. С аргументами функций не удалось пропихнуть, наверное, из-за слабой мотивации дальнейшего разделения C и C++, в целом комитет за изменение порядка аргументов проголосовал пока против, а за такое изменение за. Для меня это одно из правильных направлений развития и вообще одно из самых элегантных изменений в C++17. Перфа не потеряло.



Я решил проверить, как компиляторы к этому относятся. constexpr функции не должны содержать undefined behavior, но как видно, только clang следует стандарту. gcc, icc, msvc неправы, но забавно видеть различные исходы.



Paper proposal P0145

Стандарт по **i++ + 1**

Stackoverflow question

Compiler conformance