Консенсус вопросов о стеке потока говорит о том, что это неопределенное поведение.
Тем не менее, я недавно видел выступление Чарльза Бэй в 2016 году под названием:
Перестановка инструкций везде: правило «как будто» в C ++ и роль последовательности.
В 37:53 он показывает следующее:
Условия C ++
Неопределенный Поведение: отсутствие ограничений
(порядок инициализации глобалов)Неопределенные Поведение: нарушение ограничений
(разыменование NULL
указатель)
Теперь у меня противоречивая информация.
Это была опечатка? Что-нибудь изменилось?
Примеры связаны с неправильными вещами. Независимо от того, какую версию стандарта C ++ вы предполагаете (то есть в этом отношении ничего не изменилось в рамках стандартов).
Разыменование нулевого указателя дает неопределенное поведение. Стандарт не определяет каких-либо ограничений на то, что происходит в результате.
Порядок инициализации глобальных переменных является примером неуказанного поведения (стандарт гарантирует, что все глобальные глобальные переменные будут инициализированы [это ограничение на то, как инициализируются глобальные глобальные переменные), но порядок не указан).
Это неопределенное поведение.
От 8.3.2 Ссылки стандарта C ++ 11 (выделение мое):
5 … [ ЗаметкаВ частности, пустая ссылка не может существовать в четко определенной программе, потому что единственный способ создать такую ссылку — привязать ее к «объекту», полученному разыменование нулевого указателя, что вызывает неопределенное поведение. Как описано в 9.6, ссылка не может быть привязана непосредственно к битовому полю. —конечная нота ]