C ++ 20 führte die std::ssize()
freie Funktion wie folgt ein:
template <class C>
constexpr auto ssize(const C& c)
-> std::common_type_t<std::ptrdiff_t,
std::make_signed_t<decltype(c.size())>>;
Eine mögliche Implementierung scheint zu verwenden static_cast
, um den Rückgabewert der size()
Mitgliedsfunktion von cl ass C in sein vorzeichenbehaftetes Gegenstück umzuwandeln .
Da die size()
Mitgliedsfunktion von C immer nicht negative Werte zurückgibt, warum sollte jemand sie in vorzeichenbehafteten Variablen speichern wollen? Wenn man es wirklich will, ist es eine Frage der Einfachheit static_cast
.
Warum wird std::ssize()
in C ++ 20 eingeführt?
ssizeof
Operator hinzufügen .char
hat) von C geerbt und zumindest etwas gemildert werden(u)intX_t
, aber es ist immer noch eine endlose Quelle von ebenso subtilen und kritischen Fehlern. Dinge wiessize
sind nur Patches, und es wird eine Weile dauern (vielleicht "für immer"), bis dies in die gängigen "Best Practices Guides" einfließt, denen die Leute rigoros folgen (können).(u)intX_t
Typen optional sind , oder?)Antworten:
Die Begründung wird in diesem Papier beschrieben . Ein Zitat:
quelle
for(int i = 0; i < container.ssize() - 1; ++i)
Beispiel ist auch ziemlich überzeugendUnentgeltlich von Eric Niebler gestohlen :
quelle
Int
die gängigen Währungstypen von ganzen Zahlen sein sollten, auch wenn nur positive Zahlen sinnvoll sind (z. B. Indizieren eines Arrays). Jede Abweichung davon sollte begründet sein. Es ist schön, sich nicht überall um Casts sorgen zu müssen.