STL-Map mit Referenzen wird nicht kompiliert

8

Folgendes:

%Vor%

gibt:

%Vor%

Während der folgenden

%Vor%

gibt

%Vor%

Letzteres scheint so zu sein, dass map keine Referenz für den Schlüsselwert enthalten kann, da sie die Klasse manchmal instanziieren muss und eine Referenz ohne ein Objekt nicht instanziiert werden kann. Aber warum funktioniert der erste Fall nicht?

    
Oliver Zheng 29.05.2010, 06:04
quelle

3 Antworten

16

Es ist illegal, Referenzen in einem STL-Container zu speichern, da Typen kopierbar und zuweisbar sein müssen. Referenzen können nicht zugewiesen werden.

Genau welche Operation den ersten Fehler verursacht, hängt von der Implementierung ab, aber ich stelle fest, dass es sich auf das Erstellen einer Referenz bezieht und diese nicht sofort zugewiesen wird. Die zweite Fehlermeldung sieht so aus, als ob sie tatsächlich mit dem Erstellen des Kartenindex zusammenhängt.

Wenn Ihr Typ klein ist, können Sie ihn in die Map kopieren, oder wenn er groß ist, ziehen Sie stattdessen die Verwendung von Zeigern in Betracht, aber denken Sie daran, dass der Container die Objekte nicht für Sie freigibt, müssen Sie das explizit selbst tun.

Diese SO Frage könnte für dich von Interesse sein.

    
academicRobot 29.05.2010, 06:15
quelle
3

§8.3.2 Abschnitt 5

  

Es darf keine Verweise auf Referenzen, keine Arrays von Referenzen und keine Verweise auf Referenzen geben.

Sie denken wahrscheinlich an Referenzen als lustige Hinweise. Sie sind nicht.

    
fredoverflow 29.05.2010 07:59
quelle
1

Sie können keine Referenzen speichern, da sie nicht kopierbar sind (und einige Operationen sind unmöglich, weil sie auch nicht standardmäßig konstruierbar sind).

Sie können das Verhalten jedoch mit einem Zeiger emulieren:

%Vor%

Es ist ein bisschen nervig, weil Sie dann zweimal dereferenzieren müssen:

%Vor%

aber mit einem map ist es viel weniger verwirrend als mit einem vector oder set (es wäre (*it)->foo() .

Schließlich gibt es ein paar Fehler (die eines Zeigers):

  • Sie müssen sicherstellen, dass das Objekt, auf das gezeigt wird, so lange am Leben bleibt, wie Sie den Zeiger
  • verwenden möchten
  • Die Standardinitialisierung eines Zeigers ist ein zufälliger Wert, der ein undefiniertes Verhalten verursacht
  • Wenn der Zeiger weggeworfen wird, bleibt das Objekt (zum Glück), aber es bedeutet, dass Sie es an einem Punkt zerstört werden müssen
Matthieu M. 29.05.2010 15:11
quelle

Tags und Links