Это проверка на переполнение.Давайте посмотрим на
auto foo = narrow<int>(std::numeric_limits<unsigned int>::max())
T
будет int
и U
будет unsigned int
.Так что
T t = narrow_cast<T>(u);
даст магазин -1
в t
.Когда вы преобразуете это обратно в
if (static_cast<U>(t) != u)
, -1
преобразуется обратно в std::numeric_limits<unsigned int>::max()
, поэтому проверка пройдет.Это допустимое приведение, хотя std::numeric_limits<unsigned int>::max()
переполняет int
и является неопределенным поведением.Итак, мы переходим к
if (!details::is_same_signedness<T, U>::value && ((t < T{}) != (u < U{})))
и, поскольку знаки не совпадают, мы оцениваем
(t < T{}) != (u < U{})
, что составляет
(-1 < 0) != (really_big_number < 0)
== true != false
== true
Итак, мы бросаемисключение.Если мы пойдем еще дальше и обернемся, используя, чтобы t
стало положительным числом, тогда вторая проверка пройдет, но первая провалится, так как t
будет положительной, и приведение к типу источника останется прежним.положительное значение, которое не равно его первоначальному значению.