История изменений
Исправление maverik, (текущая версия) :
Мне кажется, кто-то ничего не понимает ни про то, как работают совеременные компиляторы, ни про UB.
Компилятор может оптимизировать программу не заботясь о том, насколько логичной она будет в случае UB. Поэтому компилятор думает так: в случае UB я могу делать все, что хочу (в т.ч. могу вызвать любую функцию), в противном случае я должен делать то, что указано. Компилятор явно видит, что Do инициализируется только в одном месте, поэтому выдает такоей код:
EraseAll();
и это нормально, т.к. если Do инициализирован, то только EraseAll() (других вариантов нет), если неинициализирован, то можно делать все, что угодно, в .т.ч. вызвать эту функцию.
В итоге в любом случае, код соответствует стандарту.
Исходная версия maverik, :
Мне кажется, кто-то ничего не понимает ни про то, как работают совеременные компиляторы, ни про UB.
Компилятор может оптимизировать программу не заботясь о том, насколько логичной она будет в случае UB. Поэтому компилятор думает так: в случае UB я могу делать все, что хочу (в т.ч. могу вызвать любую функцию), в противном случае я должен делать то, что указано. Компилятор явно видит, что Do инициализируется только в одном месте, поэтому выдает такоей код:
EraseAll();
и это нормально, т.к. если Do инициализирован, то только EraseAll() (других вариантов нет), если неинициализирован, то можно делать все, что угодно, в .т.ч. вызвать эту функцию.