No processo de responder a outra pergunta, me deparei com formulações ligeiramente diferentes para std::vector::erase()
e std::deque::erase()
.
Isto é o que C ++ 14 diz sobre std::deque::erase
( [deque.modifiers]/4-6
ênfase minha):
Efeitos: ...
Complexidade: o número de chamadas para o destruidor é igual ao número de elementos apagados, mas o número de chamadas para o operador de atribuição não é maior que o menor número de elementos Antes dos elementos apagados e o número de elementos após o elementos apagados.
Lança: nada, a menos que uma exceção seja lançada pelo construtor de cópias, mova o construtor, o operador de designação ou o operador de designação de
T
.
E aqui está o que diz sobre std::vector::erase
( [vector.modifiers]/3-5
):
Efeitos: ...
Complexidade: o destruidor de
T
é chamado o número de vezes igual ao número de elementos apagados, mas o operador de atribuição de movimento deT
é chamado o número de vezes igual ao número de elementos no vetor após os elementos apagados.Lança: nada, a menos que uma exceção seja lançada pelo construtor de cópias, mova o construtor, o operador de designação ou o operador de designação de
T
.
Como você pode ver, as especificações de exceção para os dois são as mesmas, mas std::vector
é explicitamente mencionado que o operador de atribuição de movimentação é chamado.
Há também necessidade de T
ser MoveAssignable
para erase()
trabalhar com ambos std::vector
e std::deque
(Tabela 100), mas isso não implica a presença do operador movimento atribuição: pode-se definir um operador de atribuição de cópia, e não definir movimento operador de atribuição, e esta classe vai ser MoveAssignable
.
Por precaução, verifiquei com o GCC e o Clang e, de fato, chamo o std::vector::erase()
operador de atribuição de cópias, se não houver um operador de atribuição de movimentação, e std::deque::erase()
faça o mesmo ( DEMO ).
Portanto, a pergunta é: eu perdi alguma coisa ou esta é uma questão (editorial) no padrão?
Atualização: enviei um problema LWG nº 2477 .