Copiar / mover asignación en std:: vector:: erase() y std:: deque:: erase()


En el proceso de responder otra pregunta Me topé con formulaciones ligeramente diferentes para std::vector::erase() y std::deque::erase().

Esto es lo que C++14 dice 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 de los elementos Antes de los elementos borrados y el número de elementos después de los elementos borrados.

Arrows: Nada a menos que el constructor copy, el constructor move, el operador de asignación o el operador de asignación move de T lancen 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 la elementos borrados, pero el operador mover asignación de T se llama el número de veces igual al número de elementos en el vector después de los elementos borrados.

Arrows: Nada a menos que el constructor copy, el constructor move, el operador de asignación o el operador de asignación move de T lancen 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 mover se llama al operador de asignación.

También hay un requisito para que T sea MoveAssignable para que erase() trabaje con std::vector y std::deque (Tabla 100), pero esto no implica la presencia del operador de asignación de movimiento: se puede definir un operador de asignación de copia, y no definir el operador de asignación de movimiento, y esta clase será MoveAssignable.

Por si acaso, comprobé con GCC y Clang, y de hecho std::vector::erase() llama al operador de asignación de copia si no hay ningún operador de asignación de movimiento, y std::deque::erase() lo hace lo mismo ( DEMO ).

Así que la pregunta es: ¿me perdí algo, o este es un tema (editorial) en el estándar?

Actualización: He enviado un LWG edición #2477.

Author: Community, 2015-02-02

1 answers

En la reunión de Lenexa, el asunto obtuvo un estatus inmediato con la resolución propuesta:

Este texto es relativo a N4296.

Change 23.3.3.4 [deque.modificadores] / 5 a:

-5- Complexity : 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 más que el menor del número de elementos antes de la borrada elementos y el número de elementos después de los elementos borrados.

Change 23.3.6.5 [vector.modificadores] / 4 a:

-4- Complexity : El destructor de T se llama el número de veces igual al número de los elementos borrados, pero el operador de asignación de move 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 la resolución es aceptada, no habrá ningún mención de la asignación de movimiento para std::vector::erase, y también la redacción para std::deque::erase será aclarado un poco.

 9
Author: Anton Savin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-14 18:44:27