Часто обсуждается (действительно, я думаю, что даже стандарт ссылается на него), что a @= b и a = a @ b эквивалентны. Здесь я использую @ для обозначения диапазона символов, таких как & и ^.
Однако я сомневаюсь, что они эквивалентны во время выполнения, особенно если a является атомным типом. Например:
std::atomic_int a;
a ^= 1;
(который является атомным способом переключения a), рассматривается как эквивалентный
a = a ^ 1;
Но этот второй способ состоит из не атома из-за назначения.
Поэтому я сомневаюсь в их буквальной эквивалентности, и компилятор (независимо от того, что говорит стандарт) не способен изменить более короткую форму на более длинную.
Правильно ли я?