vectorbool :: operator [] Fehlverhalten? [Duplikat]

7

Ich dachte immer, dass wir mit std::vector::operator[] tiefe Kopien des Objekts erhalten, auf das zugegriffen wird, aber es scheint, dass es nicht immer wahr ist. Zumindest mit vector<bool> gibt der folgende Testcode ein anderes Ergebnis:

%Vor%

Ausgabe (Quellcode kompiliert mit VC10 / VS2010 SP1):

%Vor%

Ich hätte erwartet, dass v[0] nach die Zuordnung x = newValue immer noch dem vorherigen Wert entspricht, aber dies scheint nicht wahr zu sein. Warum das? Warum ist vector<bool> speziell?

    
Mr.C64 30.01.2013, 11:56
quelle

3 Antworten

6

vector<bool>::operator[] liefert weder eine bool noch eine Referenz auf eine bool . Es gibt nur ein kleines Proxy-Objekt zurück, das sich wie eine Referenz verhält. Dies liegt daran, dass es keine Referenzen auf einzelne Bits gibt und vector<bool> tatsächlich die bool s komprimiert speichert. Also haben Sie mit auto gerade eine Kopie dieses referenzähnlichen Objekts erstellt. Das Problem ist, dass C ++ nicht weiß, dass dieses Objekt als Referenz fungiert. Sie müssen den "Verfall auf einen Wert" erzwingen, indem Sie auto durch T ersetzen.

    
sellibitze 30.01.2013, 12:03
quelle
20

vector<bool> ist eine abscheuliche Abscheulichkeit und etwas Besonderes. Das Committee hat sich darauf spezialisiert, Bits zu packen, daher unterstützt es keine korrekte Referenzsemantik, da Sie sich nicht auf ein Bit beziehen können, das bedeutet, dass es eine nicht konforme Schnittstelle hat und nicht wirklich als Standardcontainer qualifiziert ist. Die Lösung, die die meisten Leute benutzen, ist einfach, niemals vector<bool> zu benutzen.

    
Puppy 30.01.2013 11:58
quelle
4

operator[] gibt T& für jeden Wert von T zurück, außer für bool , wo es einen Referenz-Proxy gibt. Sehen Sie sich diese alte Spalte von Herb Sutter an, warum die Verwendung von vector<bool> im generischen Code eine schlechte Idee ist (und warum das so ist) nicht einmal ein Container). Es gibt auch einen speziellen Artikel darüber in Effective STL von Scott Meyers, und Tonnen von Fragen hier bei SO.

    
TemplateRex 30.01.2013 12:01
quelle

Tags und Links