2015-10-21 6 views
23

Ich habe Funktion, die const Referenz als Argument akzeptiert. Es sollte das Argument nicht ändern, aber es tut (Variable "_isVertex"). Wie kann das behoben werden? Hier ist der Code:Funktion ändert const Objekt

#include <vector> 
#include <iostream> 

using namespace std; 

class Element 
{ 
public: 
    bool isVertex() const 
    { return _isVertex; }; 

private: 
    bool _isVertex = true; 
}; 

class ElementContainer : public vector <Element> 
{ 
public: 
    void push(const Element &t) 
    { 
     // here everything is fine 
     cerr << t.isVertex() << ' '; 
     push_back(t); 
     // and here _isVertex is false, should be true! 
     cerr << t.isVertex() << '\n'; 
    } 
}; 

int main() 
{ 
    ElementContainer vertex; 

    vertex.push({}); 
    vertex.push(vertex[0]); 
} 
+0

Plus eins: du hast mich. Beachten Sie, dass die C++ - Standardbibliothekscontainer nicht als Basisklassen konzipiert sind. – Bathsheba

+0

'const' am Ende der Funktionsdeklaration garantiert nur, dass sich der Zustand der Klasse durch den Aufruf der Funktion nicht ändert. Der zurückgegebene Wert ist nicht const und kann nachträglich geändert werden. –

Antwort

32

Betrachten Sie sorgfältig vertex.push(vertex[0]);. t in der Funktion push ist eine konstante Referenz auf vertex[0].

Aber nach der push_back wurde der Inhalt des Vektors verschoben (aufgrund einer Speicherumverteilung), und daher ist vector[0] anderswo verschoben worden. t ist jetzt ein dangling Referenz.

Das ist undefined Verhalten. Boom.

+0

Es ist zu beachten, dass anscheinend "t" in den neu zugewiesenen Sicherungsspeicher geschoben wird, nachdem die vorhandenen Daten kopiert und der alte Sicherungsspeicher freigegeben wurde. – imallett

Verwandte Themen