Всё сложно, так как стандарт меняется.
i = i++; // Это было неопределённым поведением до C++17
i = ++i; // А это было неопределённое поведение до C++11
p[i] = i++; // Это было неопределённым поведением до C++17
Ещё на эту тему см.
V567.
В общем, теперь всё ещё более запутано и фиг разберёшься. :)
Что делать? А просто не надо писать такие конструкции. Даже если теперь они стали корректными. Они путают программиста, читающего код и заставляют задумываться. Не делайте так. И пользуйтесь анализаторам
PVS-Studio. Он укажет на непроектные и плохо написанные фрагменты кода.