Los iteradores que satisfacen los requisitos de los iteradores de salida se denominan iteradores variables. Los iteradores no mutables se denominan iteradores constantes . [24.2.1: 4]¿El incremento de un iterador de entrada mutable invalida los valores del iterador anterior?
Esto sugiere que podría tener un iterador de entrada mutable, que cumpla con los requisitos de los iteradores de entrada y salida.
Después de incrementar un iterador de entrada, las copias de su valor anterior no necesitan ser desmarcables [24.2.3]. Sin embargo, el estándar no dice lo mismo para los iteradores de salida; de hecho, la semántica operacional para el incremento de postfix se da como { X tmp = r; ++r; return tmp; }
, lo que sugiere que los iteradores de salida no pueden invalidar (copias de) los valores del iterador anterior.
Entonces, ¿el incremento de un iterador de entrada mutable invalida las copias antiguas del iterador?
En caso afirmativo, ¿cómo podría admitir código como X a(r++); *a = t
o X::reference p(*r++); p = t
con (por ejemplo) un objeto proxy?
Si no es así, ¿por qué boost::iterator
dice que necesita un objeto proxy? (El enlace es código; desplácese hacia abajo para leer los comentarios en struct
s writable_postfix_increment_proxy
y postfix_increment_result
). Es decir, si puede devolver una copia (sin referencia) del antiguo valor del iterador, ¿por qué debería envolver esta copia en un proxy?
Oh, cómo detesto estas preguntas de abogado de idiomas. También podría discutir sobre cuántos ángeles bailan en la cabeza de un alfiler. –
@MarkRansom Sí, detesto cuando las personas intentan entender el lenguaje que están usando. Malditos sean todos ... Y necesito decirle al mundo sobre mi odio por ellos aquí en * este * comentario (para el registro, las categorías de iteradores son una gran cosa en C++. Comprender qué puede hacer cada uno de ellos es bastante útil) – jalf
@MarkRansom: Mi pregunta es importante para mí porque una respuesta afirmativa significa que tengo que agregar otro objeto proxy a mi clase para manejar los iteradores de entrada mutables, como lo hace Boost. El consenso a continuación sugiere que no existe un iterador de entrada mutable (a pesar del comentario en 24.2.1: 4). Esto, a su vez, sugiere que Boost es incorrecto en el manejo de "iteradores de entrada mutables", incluso si los desarrolladores de Boost entendieron mal este aspecto del estándar, ¿no es un problema que debería abordarse? – nknight