c++ - remove - Copiar/mover asignación en std:: vector:: erase() y std:: deque:: erase()



vector pop c++ (1)

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 ( [deque.modifiers]/4-6 , énfasis 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 de T arrojen una excepción.

Y esto es 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 de T 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 de T arrojen una excepción.

Como puede ver, las especificaciones de excepción para ambos son las mismas, pero para std::vector se menciona explícitamente que se llama al operador de asignación de movimiento.

También es necesario que T sea MoveAssignable para que erase() funcione con std::vector y std::deque (Tabla 100), pero esto no implica la presencia del operador de asignación de movimiento: se puede definir una asignación de copia operador, y no define el operador de asignación de movimiento, y esta clase 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 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 .


En la reunión de Lenexa, el problema obtuvo el estado Inmediato con la resolución propuesta:

Esta redacción es relativa a N4296.

Cambie 23.3.3.4 [deque.modifiers] / 5 a:

-5- Complejidad : el número de llamadas al destructor de T es el mismo que el número de elementos borrados, pero el número de llamadas al operador de asignación de T no es mayor que el menor número de elementos antes de los elementos borrados y el número de elementos después de los elementos borrados.

Cambie 23.3.6.5 [vector.modifiers] / 4 a:

-4- 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 de T se llama el número de veces igual al número de elementos en el vector después de los elementos borrados .

Es decir, si se acepta la resolución, no habrá mención especial de la asignación de movimiento para std::vector::erase , y también se aclarará un poco la redacción de std::deque::erase .





c++14