Warum Kann ich nicht speichern Verweise in einem " std::map` in C++?
Ich verstehen, dass Referenzen sind keine Zeiger, sondern ein alias für ein Objekt. Aber ich verstehe immer noch nicht was genau bedeutet das für mich als Programmierer, also was sind Referenzen unter der Haube?
Ich denke, der beste Weg, dies zu verstehen wäre, zu verstehen, warum es ist, kann ich nicht speichern eine Referenz in einer Karte.
Ich weiß, ich muss aufhören zu denken von Referenzen als syntactic Sugar über Zeiger, nur nicht genau wie :/
- Glaube nicht, dass Referenzen, die als eingeschränkte Zeiger. Denken Sie an Sie als alias für bestehende Objekte, die nicht erlaubt sein, Links hängen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
So ist, wie ich es verstehe, Verweise implementiert werden, die als Zeiger unter der Haube. Der Grund, warum Sie kann nicht speichern Sie Sie in einer Karte ist eine rein semantische, und Sie müssen initialisiert werden Referenz, wenn es erstellt wurde, und Sie können es nicht ändern, danach nicht mehr. Diese nicht-mesh mit, wie die Karte funktioniert.
Sollten Sie denken, der eine Referenz als "const-Zeiger auf non-const-Objekt':
Darüber hinaus eine Referenz kann nur gebaut werden, weil ein alias von etwas, was vorhanden ist (Sie ist nicht notwendig für einen Zeiger, obwohl ratsam, abgesehen von NULL). Dies gilt nicht garantieren, dass das Objekt bleiben (und in der Tat haben Sie vielleicht einen Kern beim Zugriff auf ein Objekt über eine Referenz, wenn es keine mehr), sollten Sie diese-code:
Nun, es gibt zwei Anforderungen für einen STL-container:
So, in STL-Containern, die Sie verwenden müssen, proxys oder Zeiger.
Nun, mit Zeigern könnte sich als problematisch für die Handhabung des Speichers, so können Sie:
NICHT verwenden auto_ptr, es gibt ein problem mit der Zuordnung, da es ändert die Rechte operand.
Hoffe es hilft 🙂
MyObject& firstProblem = *((MyObject*)0);
ist bereits zu undefiniertem Verhalten (du bist nicht initalizing die Referenz mit einem gültigen Objekt) und damit dies allein ist nach dem C++ - standard, erlaubt formatieren Sie Ihre Festplatte oder andere schlimme Dinge zu Ihnen. (Nasen-Dämonen, anyone?) Aber das ist nur ein sehr kleiner Punkt und auch sonst für Ihre ausgezeichnete Antwort. +1Dem wichtigen Unterschied, abgesehen von der syntaktischen Zucker ist, dass Verweise nicht geändert werden, verweisen auf ein anderes Objekt als der, den Sie initialisiert wurden mit. Dies ist der Grund, warum Sie nicht gespeichert werden können in Karten oder andere Behälter, da die Behälter müssen in der Lage, ändern Sie den Typ des Elements, die Sie enthalten.
Als eine Darstellung dieses:
tatsächlich können Sie die Referenzen in einer Karte. ich weiß nicht empfehlen diese für große Projekte, als es könnte Ursache seltsame Zusammenstellung Fehler, aber:
so können Sie anzeigen, aber es wird schwierig sein, zu garantieren, es wird richtig verwendet, aber ich habe diese für kleine codes (in der Regel wettbewerbsfähig) codes
Einen container speichert eine Referenz hat zu initialisieren, das alle seine Elemente als konstruiert und ist daher weniger nützlich.
Auch, einmal initialisiert den Speicher für den container-Elemente können nicht geändert werden. s_ wird immer beziehen sich auf die Lagerung von s oben.
Diesem Beitrag wird erläutert, wie Zeiger implementiert sind unter der Haube - http://www.codeproject.com/KB/cpp/References_in_c__.aspx, die auch unterstützt sebastians Antwort.