Ваша программа имеет неопределенное поведение, именно по той причине, которую вы указали.
Ваша цепочка инструментов не обязана диагностировать неопределенное поведение и, в случаях, которые трудно "обнаружить" в целом, что является многими из них , это даже не беспокоит. В лучшем случае компоновщик (, а не компилятор) мог бы определить этот конкретный случай во время сборки, если бы люди, которые его написали, сочли это достаточно полезным, чтобы оправдать дополнительную работу и время сборки.
Но нет: это правило относится к категории ответственности программиста. Вы нарушили правила, и теперь ваша программа сломана, сложными способами, которые мы, вероятно, могли бы обработать с достаточным количеством информации о вашем компьютере, наборе инструментов, фазе луны, настроении, цвете обуви и сборке программы ... но это на самом деле не имеет никакого значения значение.
Добавление const
может привести к тому, что компилятор ( не компоновщик) в некоторых местах удалит «ссылки» на эту переменную, буквально «вставляя» значение инициализатора в точку использовать, как оптимизацию. Он может сделать это, когда узнает, что значение не изменится после инициализации (благодаря const
). В результате вы больше не наблюдаете столько странностей из-за своего неопределенного поведения, потому что поведение, которое вы видите из своей программы, более ограничено отдельными единицами перевода.