Después de destruir un objeto, ¿qué sucede con los subobjetos de tipo escalar?

Considere este código (para diferentes valores derenew ycleanse):

struct T {
    int mem;
    T() { }
    ~T() { mem = 42; }
};

// identity functions, 
// but breaks any connexion between input and output
int &cleanse_ref(int &r) {
    int *volatile pv = &r; // could also use cin/cout here
    return *pv;
}

void foo () {
    T t;
    int &ref = t.mem;
    int &ref2 = cleanse ? cleanse_ref(ref) : ref;
    t.~T();
    if (renew)
        new (&t) T;
    assert(ref2 == 42);
    exit(0);
}

Es elassert garantizado para pasar?

Entiendo que este estilo esno recomendado.Opiniones como "esto no es una práctica sana" sonno de interes aqui

Quiero una respuesta mostrando unPrueba lógica completa a partir de citas estándar. La opinión de los escritores compiladores también podría ser interesante.

EDIT: ahora con dos preguntas en una! Ver elrenew parámetro (conrenew == 0, esta es la pregunta original).

EDIT 2: Supongo que mi pregunta realmente es: ¿qué es un objeto miembro?

EDIT 3: ahora con otrocleanse ¡parámetro!

Respuestas a la pregunta(2)

Su respuesta a la pregunta