Call by value, call by reference
-
Bashar schrieb:
pyhax schrieb:
Aber ist das erlaubt? Nicht UB oder IB?
Doch UB, aber das heißt ja gerade nicht, dass der Compiler unbedingt dafür sorgen muss, dass normalerweise harmloser Code plötzlich Speicherfehler erzeugen muss.
So meinte ich das auch gar nicht. Ich dachte nur, es würde einen Speicherfehler verursachen, weil (int)(0) ja einen Nullpointer dereferenziert. Und als es dann keinen Speicherfehler gab, wollte ich wissen, ob es vlt irgend eine Klausel im Standard gibt, dass die Dereferenzierung eines Nullpointers bei der Initialisierung eine Referenz erlaubt ist.
-
Es ist keine richtige Dereferenzierung, da ja auf niedrigerer Ebene eine Referenz nichts anderes als ein Zeiger ist. Unter der Haube wurde da eigentlich nur der Wert eines Zeigers in eine Referenz kopiert.
Dereferenziert muss erst werden, sobald auf den Wert zugegriffen wird. Und da hättes BUMM gemacht:
int& ri = *static_cast<int*>(0); std::cout << ri + 7; // BUMM
-
Es ist natürlich trotzdem undefiniert ohne Ende, nicht dass hier ein falscher Eindruck entsteht. Eine Referenz muss nicht durch Pointer implementiert sein, sie muss nicht einmal eine Adresse oder überhaupt irgendeine Art von Wert haben. Und das gezeigte ist auch keine echte Nullreferenz, da es bei der kleinsten Berührung explodiert, sondern einfach ein bisschen Klugscheißen und zum Denken anregen.