Почему vector :: erase не может работать с элементом класса с const - PullRequest
0 голосов
/ 26 июня 2019

Я пытался стереть элемент вектора, в котором хранится класс, содержащий член const, но мне это не удалось, и я получил ошибку.

Когда я удаляю модификатор константы, программа компилируется нормально.

class C
{
public:
    const int i;
    C(int i = 1):i(i){};
};


int main()
{
    vector<C> v;
    C c;
    v.push_back(c);
    v.erase(v.begin());
    return 0;
}

error C2280: 'C &C::operator =(const C &)': attempting to reference a deleted function
m.cpp(151): note: compiler has generated 'C::operator =' here
m.cpp(151): note: 'C &C::operator =(const C &)': function was implicitly deleted because 'C' has a data member 'C::i' of const-qualified non-class type
m.cpp(146): note: see declaration of 'C::i'

1 Ответ

6 голосов
/ 26 июня 2019

Некоторые операции над вектором требуют, чтобы элементы были назначены для копирования или перемещения [ ref ].

В этом случае вы видите реализацию .eraseФункция не может быть скомпилирована, потому что ей нужно знать, как перемешивать элементы в контейнере [ ref ] (даже если ваш конкретный пример привел бы к пустому вектору).

Когда высделайте члена const, вы предотвращаете это.

Этого у вас не может быть const.

...