Почему «volatileQualifiedExpr + volatileQualifiedExpr» не обязательно UB в C, но в C ++?

Когда я сегодня читаю Стандарт C, он говорит о побочных эффектах

Доступ к энергозависимому объекту, изменение объекта, изменение файла или вызов функции, выполняющей любую из этих операций, являются побочными эффектами.

и стандарт C ++ говорит

Доступ к объекту, обозначенному как volatile glvalue (3.10), изменение объекта, вызов функции библиотечного ввода-вывода или вызов функции, выполняющей любую из этих операций, являются побочными эффектами.

Следовательно, поскольку оба запрещают возникновение непоследовательных побочных эффектов на одном и том же скалярном объекте, C допускает следующее, но C ++ делает его неопределенным поведением.

int a = 0;
volatile int *pa = &a;

int b = *pa + *pa;

Я правильно читаю спецификации? И в чем причина расхождения, если так?

Ответы на вопрос(1)

Ваш ответ на вопрос