Недавно увидел мем, который скинут снизу о том, что 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
Если коротко, то до 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