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!