Стандартные алгоритмы на самом деле не используют operator[]
, все они определены в терминах итераторов, если я не забыл что-то существенное. Планируется ли повторно реализовать стандартные алгоритмы поверх operator[]
для ваших «диапазонов», а не итераторов?
В тех случаях, когда немутантные алгоритмы используют итераторы, все они определены в терминах *it
, присваиваемых тому, что ему нужно назначить, или иным образом действительных для некоторой указанной операции или вызова функции. Я думаю, что все или большинство таких операций хороши со значением.
Единственное, о чем я могу думать, это то, что вы не можете передать значение, где ожидается неконстантная ссылка. Существуют ли алгоритмы без мутаций, которые требуют неконстантной ссылки? Вероятно, нет, при условии, что в любых параметрах функтора и т. Д. Содержится const
.
Извините, я не могу однозначно сказать, что нет никаких странных углов, которые могут пойти не так, но для меня это звучит нормально. Даже если есть какие-то проблемы, вы можете исправить их с очень небольшими различиями в требованиях между вашими версиями алгоритмов и стандартными.
Редактировать: вторая вещь, которая может пойти не так, это взять указатели / ссылки и держать их слишком долго. Насколько я помню, стандартные алгоритмы не сохраняют указатели или ссылки на элементы - причина этого в том, что это контейнеры , которые гарантируют действительность указателей на элементы, типы итераторов сообщают вам только когда итератор остается действительным (например, копия входного итератора не обязательно остается действительной при увеличении оригинала, тогда как прямые итераторы могут быть скопированы таким образом для многопроходных алгоритмов). Поскольку алгоритмы не видят контейнеры, только итераторы, у них нет причин полагать, что элементы являются постоянными.