return std::list<Foo &> problem
-
Ich hab ein struct Foo, welches einen CopyCtor und Zuweisungsoperator definiert hat.
Meine Klassenmethoden können auch Problemlos eine Foo & zurückgeben (natürlich keine lokale!)
Aber bei einer Methode, bei der ich so etwas versuche:
std::list<Foo &> meineMethode() { std::list<Foo &> liste; return liste; }geht es in die Hose, ich krieg mir nichts sagende Meldungen wie:
Fehler 4 error C2528: 'pointer': Zeiger auf Verweis ungültig C:\Programme\Microsoft Visual Studio 8\VC\include\xmemory 96 Fehler 5 error C2529: 'reference': Verweis auf Verweis ungültig C:\Programme\Microsoft Visual Studio 8\VC\include\xmemory 97 Fehler 7 error C2528: 'const_pointer': Zeiger auf Verweis ungültig C:\Programme\Microsoft Visual Studio 8\VC\include\xmemory 98 Fehler 9 error C2529: 'const_reference': Verweis auf Verweis ungültig C:\Programme\Microsoft Visual Studio 8\VC\include\xmemory 99 Fehler 10 error C2535: 'Foo&(*std::allocator<_Ty>::address(Foo&(&)) const)': Memberfunktion bereits definiert oder deklariert C:\Programme\Microsoft Visual Studio 8\VC\include\xmemory 116 Fehler 13 error C2529: '_Val': Verweis auf Verweis ungültig C:\Programme\Microsoft Visual Studio 8\VC\include\xmemory 154 Fehler 17 error C2529: '_Val': Verweis auf Verweis ungültig C:\Programme\Microsoft Visual Studio 8\VC\include\list 446Diese Meldungen kommen alle in xmemory oder list, und ich krieg den Zusammenhang nicht. hat das was mit der inneren struktur der std::list zu tun?
Und kommt man so nur über Zeiger daran vorbei?
-
Die Anforderungen an vector (und alle anderen Container) lauten, dass die Elementtypen Copy-Constructible (kopierbar) und Assignable (zuweisbar) sind. Referenzen sind nicht zuweisbar, deshalb können die nicht in Containern gespeichert werden.
Ja, ein möglicher Umweg wären Zeiger.
-
Achso! Danke für die Aufklärung
-
LordJaxom schrieb:
Referenzen sind nicht zuweisbar, deshalb können die nicht in Containern gespeichert werden.
Ob Referenzen zuweisbar sind, hängt davon ab, wie Zuweisbarkeit genau definiert ist.
int i=1, j=2; int &k=i, &l=j; k = l; // Zuweisung?Ich habe leider den aktuellen Standard nicht zur Hand und kann nicht nachgucken, welche Bedingungen an den Typen T genau gestellt werden.
In neueren Entwürfen ist da die Rede von "value types": value types are types for which objects, variables, references, pointers, and pointer-to-members can be created.. Das schließt automatisch Referenzen aus, weil man nicht auf Referenzen zeigen kann. In einem alten Entwurf von 2005 (N1905) gibt es einen Abschnitt "Copy Construction" im Kapitel 20.1 Requirements. In diesem wird gefordert, dass ein kopierbares Object a vom Typ T folgende Bedingung erfüllen muss: &a ist vom Typ T*. Das gilt für Referenzen natürlich auch nicht (Bei T=int& gilt &a ist vom Typ int*).
Gruß,
SP