Dies prüft auf Überlauf. Sehen wir uns
anauto foo = narrow<int>(std::numeric_limits<unsigned int>::max())
T
wird int
sein und U
wird unsigned int
sein . Also
T t = narrow_cast<T>(u);
ergibt store -1
in t
. Wenn Sie das wieder einwerfen
if (static_cast<U>(t) != u)
die -1
wird zurück zu std::numeric_limits<unsigned int>::max()
konvertiert also wird die Prüfung bestanden. Dies ist jedoch keine gültige Umwandlung als std::numeric_limits<unsigned int>::max()
überläuft ein int
und ist undefiniertes Verhalten. Dann gehen wir weiter zu
if (!details::is_same_signedness<T, U>::value && ((t < T{}) != (u < U{})))
und da die Vorzeichen nicht gleich sind, werten wir aus
(t < T{}) != (u < U{})
das ist
(-1 < 0) != (really_big_number < 0)
== true != false
== true
Also werfen wir eine Ausnahme. Wenn wir noch weiter gehen und mit t
wieder herumlaufen zu einer positiven Zahl wird, wird die zweite Prüfung bestanden, aber die erste schlägt fehl, da t
wäre positiv und das Castback zum Quelltyp ist immer noch derselbe positive Wert, der nicht gleich seinem ursprünglichen Wert ist.