Я начну с недавно возникшей проблемы: у меня был вектор, и я взял его итераторы, я сохранил итераторы (начало, конец), а затем контейнер вышел из области видимости, поэтому уничтожен. Я не помню ни одного предупреждения компилятора. Это была сложная отладка, потому что я получал segfault только тогда, когда запускал его на очень большом наборе данных. Есть ли способ получить ошибки / предупреждения компилятора при использовании итератора / любой ссылки на элемент контейнера после модификации контейнера (увеличения / уменьшения) / уничтожения? Я что-то пропустил? Я думаю, что он так же важен, как и квалификатор const
, потому что никто не хочет ссылки на элемент в испорченном контейнере, верно?
Я был вынужден вспомнить ситуацию выше, потому что теперь у меня есть еще одна домашняя работа - создать конкретный контейнер. Вместо ссылки на элемент, который является определенной областью памяти, я должен вернуть ссылку на прокси, потому что после назначения ссылки на прокси часть контейнера должна быть записана на диск. Но просто для информации, это, возможно, не имеет значения, это может быть нормальная ссылка в этом вопросе. Я хочу пометить этот метод, возвращающий ссылку на прокси (или любой метод, возвращающий итератор), как "блокировку" , что будет означать, что контейнер в течение времени жизни ссылки / итератора будет вести себя эффективно как const
. (Хотя возможен другой const
, допускающий изменение отдельных элементов, но запрещающий изменение контейнера, скажем, свойства макроса, например, будет разрешено возвращать неконстантную ссылку оператором [] для этого объекта «макрос-констант»)
Как мне это сделать на с ++? Существует ли эта концепция в других языках? Или, возможно, почему это не сработает?
Как я уже говорил ранее, я предполагаю, что это понятие достаточно общее, потому что первые структуры данных являются строительными блоками любой программы, а вторая - потому что никто не хочет ссылки на элемент в испорченном контейнере.