Почему std :: set.insert () возвращает неконстантный итератор, но я не могу его изменить?

Рассмотрим этот пример кода:

#include <set>
#include <string>

using namespace std;

set<string> string_set;

void foo(const string& a)
{
    pair<set<string>::iterator, bool> insert_result = string_set.insert(a);

    string& val = *(insert_result.first);
    val += " - inserted";
}

Итак, если оставить в стороне правильность, такую ​​как отсутствие проверки на успешную вставку и т. д., этот код выглядит так, как будто он должен позволить мне измените строку после вставки, но компилятор (VS2010) запрещает разыменование итератора на неконстантную строку (мы выполняем переход с VS2005, который размахивал этим без предупреждения).

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

Я хочу знать, как компилятор ЗНАЕТ, что мне не разрешено это делать,и как я могу узнать это без ссылки на документацию (в которой это все равно не упоминается)?

Ура, Guy

13
задан hatcat 12 April 2011 в 07:56
поделиться