¿Por qué "volatileQualifiedExpr + volatileQualifiedExpr" no es necesariamente UB en C sino en C ++?

Cuando hoy leo el Estándar C, dice acerca de los efectos secundarios

Acceder a un objeto volátil, modificar un objeto, modificar un archivo o llamar a una función que realiza cualquiera de esas operaciones son todos efectos secundarios

y el estándar de C ++ dice

Acceder a un objeto designado por un glvalue volátil (3.10), modificar un objeto, llamar a una función de E / S de la biblioteca o llamar a una función que realiza cualquiera de esas operaciones son todos efectos secundarios

Por lo tanto, debido a que ambos prohíben que se produzcan efectos secundarios no secuenciales en el mismo objeto escalar, C permite lo siguiente, pero C ++ lo convierte en un comportamiento indefinido

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

int b = *pa + *pa;

¿Estoy leyendo las especificaciones correctamente? ¿Y cuál es la razón de la discrepancia, si es así?

Respuestas a la pregunta(1)

Su respuesta a la pregunta