Подтвердить что ты не робот

Функция const const object

У меня есть функция, которая принимает аргумент const в качестве аргумента. Он не должен изменять аргумент, но он делает (переменная "_isVertex" ). Как это можно зафиксировать? Вот код:

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

Ответ 1

Рассмотрим внимательно vertex.push(vertex[0]);. t в функции push является постоянной ссылкой на vertex[0].

Но после push_back содержимое вектора перемещено (из-за перераспределения памяти), и поэтому vector[0] переместился в другое место. t теперь является обвязывающей ссылкой.

Это поведение undefined. Boom.