Как push_back без оператора = () для постоянных членов? - PullRequest
2 голосов
/ 24 марта 2012

Как push_back () в C ++ std :: vector без использования operator = (), для которого определение по умолчанию нарушает наличие членов const?

struct Item {
  Item(int value)
    : _value(value) {
  }
  const char _value;
}

vector<Item> items;

items.push_back(Item(3));

Я бы хотел сохранить константу _value, посколькуон не должен изменяться после создания объекта, поэтому вопрос в том, как мне инициализировать мой вектор с элементами без вызова operator = ()?

Вот основная ошибка, которую дает мне g ++ v3.4.6:

.../3.4.6/bits/vector.tcc: In member function `Item& Item::operator=(const Item&)':
.../3.4.6/bits/vector.tcc:238:   instantiated from `void std::vector<_Tp, _Alloc>::_M_insert_aux(__gnu_cxx::__normal_iterator<typename _Alloc::pointer, std::vector<_Tp, _Alloc> >, const _Tp&) [with _Tp = Item, _Alloc = std::allocator<Item>]'
.../3.4.6/bits/stl_vector.h:564:   instantiated from `void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = Item, _Alloc = std::allocator<Item>]'
item.cpp:170:   instantiated from here
.../3.4.6/bits/vector.tcc:238: error: non-static const member `const char Item::_value', can't use default assignment operator

1 Ответ

11 голосов
/ 24 марта 2012

Для std::vector<T> элементы должны быть назначаемыми. Вы вводите не назначается. Реализация. std::vector<T> может не настаивать на этом требовании, но это будет плохо, поскольку полученный код не будет переносимым.

Вместо этого вы можете использовать std::list<T> или изменить определение вашего типа. Например, вы можете создать метод доступа только для чтения значения, но без установки. Конечно, назначение изменило бы значение. Таким образом, выбор состоит в том, чтобы либо разрешить это изменение, либо разрешить помещать объекты в контейнер. Вы не получите оба.

...