Und da kommste dann an den Punkt, den ich mein: Warum nutzt überhaupt jemand short? Beziehungsweise gibt es überhaupt andere integrale Typen außer int? Naja aus irgendwelchen abstrusen Effizienzgründen.
Die Effizienzgründe sind keineswegs abstrus. C++ ist und bleibt eine Produktionssprache mit dem Paradigma Zero Overhead. Dass gleichzeitig Sprachfeatures angeboten werden, von denen die meisten anderen gängigen Sprachen aktuell nur träumen können, ist das eigentlich Geniale. Wenn effizienzbedingte Features falsch eingesetzt werden, ist das nicht Problem der Sprache, sondern des Programmierers, der unbegründet
short einsetzt. Sollten dir derlei Konvertierungen das Leben schwer machen, bietet dir aber wohl jeder vernünftige Compiler die Möglichkeit, in Debug-Builds auf Überläufe zu testen. In VC++ wäre das z.B. "Smaller Type Check" bzw.
/RTCc.
Und genau DAS lass ich nicht gelten.
Warum kann ich nicht einfach sagen: "Hört mal her lieber Compiler und Laufzeitumgebung, ich muss hier irgendwie 'nen Wert zwischen 1 und 100 speichern, macht mir mal (Build I) das bezüglich Laufzeit Effizienteste daraus was geht und (Build II) etwas Sicheres, was mich informiert, wenn dieser Wertebereich wider Erwarten doch verlassen wird."
C++ ist eine universelle Bibliothekssprache. Die Sprache selbst versucht nach Möglichkeit alles anzubieten, was zur sinnvollen und effizienten Implementierung von anwendungsspezifischen Features erforderlich ist, ohne dabei selbst in ihrer Sprachspezifikation unerfüllbar umfangreich oder domänenspezifisch zu werden. Die Features, die du ansprichst, lassen sich mit Templates problemlos und elegant umsetzen. Deshalb wäre es grober Unfug, derlei Features fest in die Sprache aufzunehmen, zumal an integrale Datentypen gestellte Forderungen stets
sehr anfwendungsspezifisch sind.
Nimm als anderes Beispiel einfach const. Braucht im Prinzip auch kein Mensch, trotzdem hilft es dir robusteren Code zu schreiben und Fehler zu vermeiden und dem Compiler effizienteren Maschinencode zu produzieren. Noch dazu trägt eine const-Variable eben auch eine inhärente Botschaft, für jemanden der den Code später vielleicht mal lesen, warten oder anderweitig nutzen muss. Da schlägt sich dann für mich wieder der Bogen zur Dokumentationsproblematik, weil ich eben nicht explizit dokumentieren muss, dass die Variable im Sinne des Systems nur "read-only" ist.
C++ bietet dir sein Typsystem und
const ist Teil dieses Typsystems, genau wie Templates es sind. Mit Templates kannst du elegant Typen definieren und typsicher annotieren, in deinem Fall z.B.
integer<1, 100>. Damit hast du gleichermaßen Typauswahl, Laufzeitchecks und Dokumentation, wie von dir beschrieben, mit minimalem Overhead. Wieso sollte derlei Funktionalität also in die Sprache aufgenommen werden? Dass Templates eine gewisse Barriere darstellen, bestreite ich nicht ...
Klar kann ich das. Ich kann mir auch 'ne komplett eigene Super-Special-Awesome-Sprache definieren oder das Rad komplett neu erfinden. Aber das fällt eben eigentlich leider nicht in mein angestrebtes Tätigkeitsspektrum. ;)
... aber diese Barriere ist weitaus geringer, als deine eigene domänenspezifische Sprache zu entwickeln. Klar muss derlei Bibliotheksfunktionalität irgendwann mal implementiert werden, genau wie derlei Sprachfeatures irgendwann mal implementiert werden müssten. Der Unterschied ist, die Bibliothek könntest du stemmen, eine vergleichbare eigene Sprache niemals. Andernfalls musst du eben warten, bis ein anderer dies für dich erledigt.
Schlussendlich ist das Funktionalität, die man in die Standardbibliothek aufnehmen könnte, und vielleicht in vielen Jahren auch wird. Dafür wird es jedoch zunächst einer erprobten Referenzimplementierung bedürfen, an der eine derartige Standardisierung ansetzen kann.