Question Fonction modifie l'objet const


J'ai la fonction qui accepte la référence const comme argument. Il ne devrait pas changer d’argument, mais il le fait (variable "_isVertex"). Comment cela peut-il être corrigé? Voici le code:

#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]);
}

23
2017-10-21 12:05


origine


Réponses:


Considérez attentivement vertex.push(vertex[0]);. t dans la fonction push est une référence constante à vertex[0].

Mais après le push_back, le contenu du vecteur a été déplacé (suite à une réallocation de mémoire), et donc vector[0] a déménagé ailleurs. t est maintenant un référence pendante.

C'est comportement indéfini. Boom.


32
2017-10-21 12:15