Что происходит с подобъектами скалярного типа после уничтожения объекта?
Рассмотрим этот код (для разных значенийrenew
а такжеcleanse
):
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);
}
Этоassert
гарантированно пройти?
Я понимаю, что этот стильnot рекомендуемые.Opinions как "это не правильная практика" являютсяnot здесь интерес
Я хочу ответ, показывающийcomplete logical proof from standard quotes, Мнение авторов компиляторов также может быть интересным.
РЕДАКТИРОВАТЬ: теперь с двумя вопросами в одном! Увидетьrenew
параметр (сrenew == 0
это оригинальный вопрос).
РЕДАКТИРОВАТЬ 2: Я думаю, мой вопрос на самом деле: что такое объект члена?
РЕДАКТИРОВАТЬ 3: теперь с другимcleanse
параметр!