Ошибка компиляции, связанная с вектором const std::string

Пожалуйста, объясните, почему следующий код не компилируется с помощью 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;

ТИА.

Ответы

Ответ 1

Чтобы стереть элемент, необходимо переместить элементы правой руки (сдвинуть влево).

Так как ваши строки const, старый элемент не может быть перезаписан (через оператор =), следовательно, ошибка.

Ответ 2

Означает ли это, что нет смысла иметь вектор константных строк, если элементы могут быть удалены? Yes at least what the standard says

23.3.7.5 векторные модификаторы [vector.modifier]

стирание итератора (позиция константы); стирание итератора (const_iterator сначала const_iterator);

Эффекты: отменяет итераторы и ссылки на месте или после точки стирания.

Сложность. Деструктор T называется числом раз, равным числу стираемых элементов, но оператор назначения перемещения для T называется числом раз, равным количеству элементов в векторе после стираемых элементов.

Броски: ничего, если исключение не будет создано конструктором копирования, перемещением конструктора, оператором присваивания или оператором присваивания перемещения T.