Po zniszczeniu obiektu, co dzieje się z podobiektami typu skalarnego?

Rozważ ten kod (dla różnych wartościrenew icleanse):

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

Jestassert gwarantowane przejście?

Rozumiem, że ten styl jestnie Zalecana.Opinie jak „to nie jest dobra praktyka”nie zainteresowania tutaj.

Chcę odpowiedź pokazującąkompletny dowód logiczny ze standardowych cytatów. Interesująca może być opinia autorów kompilatorów.

EDYCJA: teraz z dwoma pytaniami w jednym! Zobaczrenew parametr (za pomocąrenew == 0, to jest oryginalne pytanie).

EDYCJA 2: Myślę, że moje pytanie naprawdę brzmi: co to jest obiekt członkowski?

EDYTUJ 3: teraz z innymcleanse parametr!

questionAnswers(2)

yourAnswerToTheQuestion