Sie haben die beiden C++ - Fälle ausgewählt, bei denen Nullheit keinen Sinn ergibt. :-)
Ihre const FooList
ist ein Nicht-Zeiger-Typ, so kann niemals nullptr
(oder NULL
auf älteren C++ Compiler) sein.
Referenzen sind durch den Standard definiert als nie nullptr
entweder. Das macht Sinn, denn nullptr
ist ein Zeigertyp, und die einzige Möglichkeit, von einem nullptr
zu einem Verweis zu gehen, ist das Dereferenzieren, was ... na ja, niemand weiß, was passiert, wenn Sie einen Nullzeiger dereferenzieren.
jedoch der einzige Fall, in dem Sie nicht nullability (die const Foo*
in der Struktur) angegeben haben, ist eigentlich, wo es gültig wäre.
Zumindest, wenn Sie auf Apples Compiler laufen. Technisch gesehen ist Apples Nulltabilität nur ein Teil der Objective-C (und der Erweiterung Objective-C++) Standards, also eine nicht-standardisierte Erweiterung von C++, die vom Compiler abhängt (daher der Unterstrich an seinem Anfang, der für compilerspezifische Schlüsselwörter reserviert ist)).
NB - Aus Performance-Gründen, die meisten C++ Compiler nur Referenzen als syntaktischer Zucker oben auf Zeigern, implementieren, so in der Praxis Sie etwas Böses wie
Foo* myFoo = nullptr;
Foo& myFooRef = *myFoo;
und sie würden Sie nicht tun konnte, wissen gerade eine nullptr
Referenz gemacht, aber das fällt unter "undefiniert" Verhalten und als solche ist falscher Code. Allerdings weiß ich nicht, ob ein Objective-C++ - Compiler derzeit die Nullwertfähigkeit von C++ - Referenzen analysiert. Ein schneller Test zeigt Apple's zumindest nicht. Nicht sicher, ob der statische Analysator es auch fängt.
PS - Wenn Sie den obigen Code zu kompilieren versucht, sollten Sie einen Fehler über den Gebrauch von _Nullable
(sic) auf einem Nicht-Zeiger-Typ erhalten.
Vielen Dank! Ich nehme an, Sie haben herausgefunden, dass ich C++ nicht wirklich kann. :) –