Ну цифра 3 же есть. Он мог посмотреть, что n = 3, и что 3 потом никак не меняется.
Компилятор С++ вообще умеет всё что угодно при компиляции считать.
Можно написать
int accum = 0;
for (int i = 0; i < 100; i++) {
accum = i;
}
И при правильном запуске (там вроде бы какая-то магия с constexpr) компиляции, он еще при компиляции посчитает, чему равен accum. Потому что все значения, на которых этот код с циклом работает - это compile-time значения. Ничего не зависит от рантайма. Поэтому почему бы не прогнать цикл во время компиляции.