C++ hat so etwas mit Referenzen, ja. Ist im Prinzip genau das, bloß noch mit syntaktischem Zucker, da Referenzen keine Zeiger-Arithmetik zulassen.
Der Nachteil von Null-Referenzen/-Zeigern/NIL zeigt sich erst in größeren Programmen, in denen es fix passieren kann, dass man vergisst, zu prüfen, ob eine Addresse/Referenz auch wirklich-wirklich gültig ist. Vergisst man das, kommt es zu etwas happig zurückzuverfolgenden Fehlern, deren abscheulichste Ausartung in NIL von z.B. Ruby vollendet wurde.
Dieser Nachteil bringt allerdings einen gewaltigen Vorteil mit sich:
Wenn eine Referenz ungültig sein darf, kann man sehr fix per simpelster Fallunterscheidung prüfen, ob überhaupt etwas zu Tun ist.
Der Kompromiss zwischen Null-Referenzen-sind-super und Null-ist-riskant sind Null-Objekte. Da kann man nichts vergessen und ihr Verhalten lässt sich passgenau zuschneiden. Der Code braucht auch keine Sonderfälle mehr zu betrachten, da es keine mehr gibt. Die einfachste Form eines Null-Objekts ist eines, das nichts tut. Man könnte aber auch Spielereien wie Trace-Funktionen verbauen, usw.
Aber auch die haben einen Nachteil:
Sie bringen einen Overhead für's Nichts-Tun mit sich.
Und da sitzen wir jetzt. D: Zwei Konzepte, beide mit Vor- und Nachteilen, beide auf zwei gänzlich verschiedene Bedürfnisse zugeschnitten. Und so lange es diese zwei Bedürfnisse gibt (Leistung vs. Robustheit), haben auch beide Konzepte ihre wohlverdiente Existenzberechtigung.
Ich weiß jetzt nicht, wie Rust das umsetzt und wie Rust ausschaut, aber das Geschwätz ist auch eher allgemein gehalten. D;
Mir ist Python's Syntax zuwider.