Iterators that further satisfy the requirements of output iterators are called mutable iterators. Nonmutable iterators are referred to as constant iterators. [24.2.1:4]
Это говорит о том, что у вас может быть изменяемый итератор ввода, который удовлетворяет требованиям итераторов ввода и вывода.
После увеличения входного итератора копии его старого значения не нужно разыменовывать [24.2.3]. Однако стандарт не говорит того же о итераторах вывода; на самом деле операционная семантика для приращения постфикса дается как
{ X tmp = r; ++r; return tmp; }
, предполагая, что выходные итераторы не могут делать недействительными (копии )старых значений итератора.Итак, может ли увеличение изменяемого итератора ввода сделать недействительными старые копии итератора?
Если да, то как бы вы поддерживали такой код, как
X a(r++); *a = t
илиX::reference p(*r++); p = t
с (, например. )прокси-объект?Если нет, то почему
boost::iterator
утверждают, что ему нужен прокси-объект? (Ссылка является кодом; прокрутите вниз, чтобы прочитать комментарии кstruct
swritable_postfix_increment_proxy
иpostfix_increment_result
). То есть, если вы можете вернуть (разыменовываемую )копию старого значения итератора, зачем вам нужно оборачивать эту копию в прокси?