Для начала - код полностью валидный и успешно соберется. Нехватка ретурна никак не мешает.
If control reaches the end of main without encountering a return statement, the effect is that of executing return 0
Дальше. Весь прикол тут в том, что id - глобальная переменная. Действительно, если бы она была локальной переменной main:
int main()
{
int id;
std::cout << id;
}
то было бы использование неинициализированной переменной, неопределенное поведение и на экран вывелся бы мусор.
Однако id - глобальная переменная. К ним применяются немного другие правила.
Дело в том, что все глобальные переменные инициализируются перед main. Вопрос только в том, как они это делают.
В данном случае, так как нет явного инициализатора, происходит так называемая zero-инициализация. И id будет равно 0.
Итого. На экране появится "0".
Stay defined. Stay cool.
#cppcore