¿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í?