Рассмотрим этот код:
#include <iostream>
#include <climits>
#include <fenv.h>
int main()
{
feenableexcept(FE_INVALID);
double d = INT_MAX * 2.0f;
int i = (int)d; // it throws here fp exception and terminates. Why ?
std::cout << i << std::endl;
return 0;
}
Первое, что здесь можно заметить, это то, что приведение double к int вызывает переполнение временного значения (оно больше INT_MAX
), что, конечно,в общем случае неопределенное поведение.
Но меня больше беспокоит тот факт, что исключение FP здесь может быть перехвачено путем передачи константы FE_INVALID
в функцию feenableexcept
.
Из cpp_reference Я вижу, что FE_INVALID
не имеет никакого отношения к переполнению вообще.
Почему тогда переполнение целыми числами здесь вызывает исключение fp?
Это из-за природы UB?