Ответ 1
Чтобы стереть элемент, необходимо переместить элементы правой руки (сдвинуть влево).
Так как ваши строки const
, старый элемент не может быть перезаписан (через оператор =
), следовательно, ошибка.
Пожалуйста, объясните, почему следующий код не компилируется с помощью clang 3.5.
Сообщается об ошибке: "Невозможно перегрузить" = "в алгоритме".
std::vector<const std::string> m_messages;
std::vector<const std::string>::iterator iter;
...
if (iter != m_messages.end())
{
m_messages.erase(iter); // compilation error
}
Если я объявляю m_messages
как: std::vector<std::string> m_messages;
, тогда он компилируется ОК.
Кроме того, в чем разница между:
std::vector<const std::string> m_messages;
и
std::vector<std::string> m_messages;
ТИА.
Чтобы стереть элемент, необходимо переместить элементы правой руки (сдвинуть влево).
Так как ваши строки const
, старый элемент не может быть перезаписан (через оператор =
), следовательно, ошибка.
Означает ли это, что нет смысла иметь вектор константных строк, если элементы могут быть удалены? Yes at least what the standard says
23.3.7.5 векторные модификаторы [vector.modifier]
стирание итератора (позиция константы); стирание итератора (const_iterator сначала const_iterator);
Эффекты: отменяет итераторы и ссылки на месте или после точки стирания.
Сложность. Деструктор T называется числом раз, равным числу стираемых элементов, но оператор назначения перемещения для T называется числом раз, равным количеству элементов в векторе после стираемых элементов.
Броски: ничего, если исключение не будет создано конструктором копирования, перемещением конструктора, оператором присваивания или оператором присваивания перемещения T.