«Какие вещи требуют этой техники?»
Факт: нет.
Тем не менее, существует множество полезных вещей, которые вы ХОТИТЕ делать перед главным по разным причинам. В качестве одного практического примера, скажем, у вас есть абстрактная фабрика, которая создает doohickies. Вы можете убедиться, что создаете экземпляр фабрики, назначаете его для какой-то особой области, а затем регистрируете для него различные конкретные функции ... да, вы можете это сделать.
С другой стороны, если вы реализуете фабрику как одиночную и используете факты глобальной инициализации значений, чтобы «обмануть» реализацию в регистрации конкретных дурацких команд перед запуском main, вы получите несколько преимуществ при очень небольших затратах (факт использования синглтоны, в основном здесь не проблема, почти единственная).
Например, вы:
Не нужно вести список регистраций, которые все должны называться явно. Фактически, вы можете даже объявить и определить целый класс в закрытой области видимости, недоступном для кого-либо, и иметь его доступным для использования при запуске программы.
main () не должен делать кучу дерьма с кучей объектов, о которых он не заботится.
Итак, на самом деле ничего из этого не нужно . Однако вы можете уменьшить количество проблем с подключением и обслуживанием, если воспользуетесь тем фактом, что глобальные переменные инициализируются до того, как начнется main.
Edit:
Следует отметить, что с тех пор я узнал, что это не гарантируется языком. C ++ только гарантирует, что инициализация ноль или константа произойдет до main. В этом ответе я говорю о динамической инициализации. Это гарантия C ++ происходит перед первым использованием переменной, во многом как функциональные локальные статические переменные.
Кажется, что каждый компилятор выполняет динамическую инициализацию перед main. Я думал, что однажды столкнулся с тем, чего не произошло, но я думаю, что источником проблемы было что-то другое.