void reference?
-
durch das "would be" wird aber ausgedrückt, dass es der einzige weg, eine null referenz zu bekommen, das dereferenzieren eines null pointers wäre, das aber undefiniertes verhalten auslöst.
in der anderen stelle sagt der standard eindeutig, dass der effekt des derefenzieren eines null zeigers undefiniertes verhalten ist.
-
Kommt Leute, er hat's eigentlich schon lange kapiert.
-
Don't feed the troll.
-
groovemaster2002 schrieb:
a null reference cannot exist in a well-defined program
Das interpretiere ich so, dass ein Programm welches Null-Referenzen nutzt, undefiniertes Verhalten aufweist. Nicht aber, dass es keine Null-Referenzen gibt. Wie man sie erzeugt:
because the only way to create such a reference would be to bind it to the ?object? obtained by dereferencing a null pointer
which causes undefined behavior.
Und genau dieses "object" an das die Null-Referenz gebunden wird, erzeugt undefiniertes Verhalten. Ich kann beim besten Willen nicht erkennen, dass das Dereferenzieren selbst undefiniert sein soll.
Also nochmal ganz langsam:
"cannot exist" heisst "kann es nicht geben"
Und daran kann man nix falsch verstehen. es heisst "es gibt sie nicht", und wenn es etwas nicht gibt, kann man es auch nicht erstellen.
Wenn du eine 'NULL Reference' erstellst, dann nutzt die sie ja!would be - ist MÖGLICHKEITSFORM, wenn es also möglich wäre, würden sie schreiben:
the only way to create such a reference is to bind...das Dereferenzieren eines NULL Zeigers IST undefiniert. Da gibts keinen Kontext. Ich habe auf die schnelle nur diese eine Stelle im Standard gefunden - aber selbst diese ist doch wohl nicht falsch interpretierbar.
Einige Sachen sind undefiniert, zum Beispiel das dereferenzieren eines NULL Pointers.
Da steht nicht "zum Beispiel das dereferenzieren eines NULL Pointers in bestimmten Situationen", sondern es ist eine absolute Aussage - ohne Ausnahmen.
Oder zeig mir doch mal die Stelle im Standard wo steht, dass ich einen NULL Zeiger dereferenzieren darf.
Vielleicht solltest du nochmal darüber nachdenken. Es ist nicht lustig dir alles 100 mal zu erklären. Wenn du uns nicht glaubst, frag in comp.std.c++
-
Es wird wohl Zeit für die Merkbefreiung. Wer will?
Da steht eindeutig 'cannot exist'. Das mit 'kann es doch geben' zu übersetzen ist schon einigermaßen kreativ :p BTW hatte ich gemeint 99,9% aller standardkonformen Compiler, aber das spielt jetzt wohl auch keine Rolle mehr

-
int * foo = 0; // OK *foo; // Fehler!!! es wird NULL-dereferenziertFertig. Da bereits hier ein Fehler ist, ist es sinnlos darüber nachzudenken, ob man nicht eine Referenz erstellen könnte.
-
Nur mal so gedacht:
Wenn es die NULL-Referenz nicht geben würde, müsste ja nicht davor gewarnt werden.
Der Satz:
"In einer idealen Welt gibt es keinen Hunger" bedeutet ja auch nicht, dass es keinen Hunger gäbe. Sondern nur, dass wir keine ideale Welt haben.
-
Ich frage mich immer wieder, wie man über ein solches Thema 3 Seiten diskutieren kann...

Devil
-
Geo schrieb:
Nur mal so gedacht:
Wenn es die NULL-Referenz nicht geben würde, müsste ja nicht davor gewarnt werden.
Der Satz:
"In einer idealen Welt gibt es keinen Hunger" bedeutet ja auch nicht, dass es keinen Hunger gäbe. Sondern nur, dass wir keine ideale Welt haben.Richtig. Der Begriff «undefiniertes Verhalten» bezieht sich aber nunmal auf eine Idealwelt. Nämlich die, die die meisten der am Standardisierungsprozess beteiligten Parteien (Compilerhersteller, Benutzer, Toolhersteller ...) den kleinsten gemeinsamen Nenner darstellt. In der realen Welt, sagen wir unter Unix, ist die Dereferenzierung eines Nullpointers eine klare Sache. Das Programm bekommt ein SIGSEGV zugestellt und wird abgeschossen, Ende der Diskussion, 100% definiert. Unter MS-DOS wird je nach Speichermodell entweder der Interruptvektor 0 oder halt die Stelle 0 des aktuellen Segments ausgelesen oder verändert (uh oh!), Punkt. Der Z8 hat glaub ich an Adresse 0 seinen ersten IO-Port eingeblendet, da ruckt vielleicht der angeschlossene Schrittmotor los oder was weiß ich
Der C++-Standard will sich aber nicht aufbürden, das alles irgendwie zu definieren ... angenommen man würde fordern, dass dabei eine Exception generiert werden muss. Das würde bedeuten, dass jeder Zeigerzugriff geprüft werden muss, was der Performance nicht gerade zuträglich ist. Also lässt man den Effekt undefiniert und ist aus dem Schneider. Programmierer tun gut daran, sowas zu umschiffen und sich nicht auf die «Laune» die ihr Compiler gerade an den Tag legt zu verlassen, zumindest wenn sie Wert auf Portabilität legen.
</pamphlet>
-
Bashar schrieb:
Es wird wohl Zeit für die Merkbefreiung.
Ganz meine Meinung. Ich denke aber, dass der Gedanke reicht. Ein tatsächliches Posten der Merkbefreiung ist nicht nötig. Ich mach hier zu und dann ist ruh'!