En el proceso de responder otra pregunta, me topé con palabras ligeramente diferentes para std::vector::erase()
y std::deque::erase()
.
Esto es lo que dice C ++ 14 sobre std::deque::erase
(el [deque.modifiers]/4-6
énfasis es mío):
Efectos: ...
Complejidad: el número de llamadas al destructor es el mismo que el número de elementos borrados, pero el número de llamadas al operador de asignación no es mayor que el menor número de elementos antes de los elementos borrados y el número de elementos después del elementos borrados
Lanzamientos: nada a menos que el constructor de copias, el constructor de movimientos, el operador de asignación o el operador de asignación de movimientos arrojen una excepción
T
.
Y aquí está lo que dice sobre std::vector::erase
( [vector.modifiers]/3-5
):
Efectos: ...
Complejidad: El destructor de
T
se llama el número de veces igual al número de elementos borrados, pero el operador de asignación de movimiento deT
se llama el número de veces igual al número de elementos en el vector después de los elementos borrados.Lanzamientos: nada a menos que el constructor de copias, el constructor de movimientos, el operador de asignación o el operador de asignación de movimientos arrojen una excepción
T
.
Como puede ver, las especificaciones de excepción para ambos son las mismas, pero std::vector
se menciona explícitamente que se llama al operador de asignación de movimiento.
También hay requisito para T
ser MoveAssignable
para erase()
trabajar con ambos std::vector
y std::deque
(Tabla 100), pero esto no implica la presencia del operador de asignación movimiento: se puede definir un operador de asignación de copia, y no definir operador de asignación movimiento, y esta clase será ser MoveAssignable
.
Por si acaso, verifiqué con GCC y Clang, y de hecho std::vector::erase()
llama al operador de asignación de copias si no hay un operador de asignación de movimiento, y std::deque::erase()
hace lo mismo ( DEMO ).
Entonces la pregunta es: ¿me perdí algo, o este es un problema (editorial) en el estándar?
Actualización: He enviado un número de LWG # 2477 .