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