Вы можете быть смущены неопределенным поведением здесь.Стандарт C ++ не имеет правил относительно того, что происходит, если вы используете объект после запуска его деструктора, поскольку это неопределенное поведение, и, следовательно, реализация может делать все что угодно.Как правило, разработчики компиляторов не делают ничего особенного для неопределенного поведения, и поэтому то, что происходит, является артефактом того, какие другие проектные решения были приняты.(Это может иногда приводить к действительно странным результатам.)
Поэтому, как только вы запустите деструктор, у компилятора больше не будет никаких обязательств в отношении этого объекта.Если вы не обращаетесь к нему снова, это не имеет значения.Если вы ссылаетесь на него, это неопределенное поведение, и с точки зрения Стандарта поведение не имеет значения, и, поскольку Стандарт ничего не говорит, большинство разработчиков компиляторов не будут беспокоиться о том, что делает программа.
Вв этом случае проще всего оставить объект нетронутым, поскольку он не удерживает ресурсы, а его хранилище было выделено как часть запуска функции и не будет возвращено до выхода из функции.Следовательно, значение элемента данных останется прежним.При чтении ob2.day
компилятору обычно нужно получить доступ к области памяти.
Как и любой другой пример неопределенного поведения, результаты могут измениться при любых изменениях обстоятельств, но в этом случае онивероятно не будет.Было бы неплохо, если бы компиляторы улавливали больше случаев неопределенного поведения и диагностировали проблемы, но компиляторы не могли обнаружить все неопределенное поведение (некоторые происходят во время выполнения), и часто они не проверяли поведение, о котором они не думаливероятно.