gsl::narrow-Implementierung verstehen

gsl::narrow-Implementierung verstehen

Dies prüft auf Überlauf. Sehen wir uns

an
auto 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.