Depois que um objeto é destruído, o que acontece com sub-objetos do tipo escalar?

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

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);
}

É oassert Garantido para passar?

Eu entendo que esse estilo énão recomendado.Opiniões como "isso não é uma boa prática" sãonão de interesse aqui.

Eu quero uma resposta mostrando umprova lógica completa de citações padrão. A opinião de escritores de compiladores também pode ser interessante.

EDIT: agora com duas perguntas em um! Veja orenew parâmetro (comrenew == 0, esta é a pergunta original).

EDIT 2: Eu acho que minha pergunta é realmente: o que é um objeto membro?

EDIT 3: agora com outrocleanse parâmetro!

questionAnswers(2)

yourAnswerToTheQuestion