Рассмотрим пример кода:
#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