¿Es la falla de segmentación un comportamiento indefinido real cuando nos referimos a un miembro de datos no estático?

Había leído la siguiente regla y he estado tratando de escribir un ejemplo, que refleja uno. La regla es de 3.8 / 5 N3797:

Antes de que comience la vida útil de un objeto, pero después de que se haya asignado el almacenamiento que ocupará el objeto o, después de que haya finalizado la vida útil de un objeto y antes de que se reutilice o se libere el almacenamiento que ocupó el objeto, cualquier puntero que se refiera al almacenamiento Se puede usar la ubicación donde se ubicará o se ubicará el objeto, pero solo de manera limitada. Para un objeto en construcción o destrucción, ver 12.7.De otra manera, dicho puntero se refiere al almacenamiento asignado (3.7.4.2) y al uso del puntero como si el puntero fuera de tipovoid* Está bien definido. La indirecta a través de dicho puntero está permitida, pero el valor resultante solo se puede usar de forma limitada, como se describe a continuación. El programa tiene un comportamiento indefinido si:

[...]

- el puntero se usa para acceder a un miembro de datos no estático o llamar a una función de miembro no estático del objeto, o

[...]

El ejemplo que he escrito para:

#include <iostream>
#include <typeinfo>

using std::cout;
using std::endl;

struct A
{
    int b = 5;
    static const int a = 5;
};

int main()
{
    A *p = (A*)0xa31a3442;
    cout << p -> a; //1, Well-fromed, there is no compile-time error
    cout << p -> b; //2, Segmentation fault is producing
}

¿Es cierto que en el caso//1 está bien formado y no causa ningúnUB, pero//2 error de segmentación producido, que esUB?

Respuestas a la pregunta(3)

Su respuesta a la pregunta