LINUX.ORG.RU

История изменений

Исправление maverik, (текущая версия) :

Мне кажется, кто-то ничего не понимает ни про то, как работают совеременные компиляторы, ни про UB.

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

EraseAll();

и это нормально, т.к. если Do инициализирован, то только EraseAll() (других вариантов нет), если неинициализирован, то можно делать все, что угодно, в .т.ч. вызвать эту функцию.

В итоге в любом случае, код соответствует стандарту.

Исходная версия maverik, :

Мне кажется, кто-то ничего не понимает ни про то, как работают совеременные компиляторы, ни про UB.

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

EraseAll();

и это нормально, т.к. если Do инициализирован, то только EraseAll() (других вариантов нет), если неинициализирован, то можно делать все, что угодно, в .т.ч. вызвать эту функцию.