La forma de 3 argumentos de list::splice()
mueve un solo elemento de una lista a la otra. SGI's documentation establece explícitamente que todos los iteradores, incluyendo el que apunta al elemento que se mueve siguen siendo válidos. Roguewave's documentation no dice nada sobre las propiedades de invalidación del iterador de los métodos splice()
, mientras que el estándar C++ establece explícitamente que invalida todos los iteradores y las referencias al elemento que se empalma.empalme() en std :: list e invalidación de iterador
splicing() funciona en la práctica como lo define SGI, pero obtengo una falla de aserción (desreferenciación del iterador no válido) en las versiones depug/secure SCL de la implementación STL de microsoft (que sigue estrictamente la letra del estándar).
Ahora, estoy usando list exactamente porque quiero mover un elemento entre listas, mientras se preserva la validez del iterador que lo señala. El estándar ha hecho un cambio extremadamente inútil a la especificación original de SGI.
¿Cómo puedo evitar este problema? ¿O debería ser simplemente pragmático y meter la cabeza en la arena (porque el empalme no no invalida iteradores en la práctica, ni siquiera en la implementación del MS, una vez que la depuración del iterador está desactivada).
Una gran pregunta. ¿Cuál fue la última palabra? –
El estándar es estúpido, pero correcto. No use empalmes en programas que se ajusten a las normas. Tal vez C++ 1x enmendó la situación; No lo he comprobado – zvrba
Acabo de verificar, cambia. La redacción retenida es la del defecto 250 de LWG: los iteradores anteriores son válidos y se comportan como si apuntaran al nuevo contenedor. –