UB - значит что такой случай компилятором не рассматривается. ну вот например в крестах не рассматривется случай когда ты пытаешься получить доступ за границами массива к примеру. Поведение программы в которой произошел такой доступ неопределено, поскольку не ожидалось.
UB - значит, этот случай рассматривается компилятором как невозможный и компилятор может сделать из этого вывод
for (int i = 0; i < v.size(); ++i) //int - i32, size - u64
компилятор: знаковые типы не переполняются, я размещаю i в 64-битный регистр