O padrão define precisamente o que posso fazer com um objeto depois que ele foi movido? Eu costumava pensar que tudo o que você pode fazer com um objeto movido é destruí-lo, mas isso não seria suficiente.
Por exemplo, considere o modelo de função swap
conforme definido na biblioteca padrão:
template <typename T>
void swap(T& a, T& b)
{
T c = std::move(a); // line 1
a = std::move(b); // line 2: assignment to moved-from object!
b = std::move(c); // line 3: assignment to moved-from object!
}
Obviamente, deve ser possível atribuir a objetos movidos, caso contrário as linhas 2 e 3 falharão. Então, o que mais posso fazer com objetos movidos de? Onde exatamente posso encontrar esses detalhes no padrão?
(A propósito, por que está em T c = std::move(a);
vez da T c(std::move(a));
linha 1?)
fonte
pop_back
mudar devector
. Mas você certamente pode descobrir se éempty()
.pop_back
de um vaziovector
tem um comportamento indefinido de qualquer maneira, da memória, por isso tenho certeza de que apop_back
partir de um vetor movido que exibe um comportamento indefinido é consistente.pop_back
ainda se comporta como em qualquer vetor válido (pode até ser um vetor vazio).17.6.5.15 [lib.types.movedfrom]
Quando um objeto está em um estado não especificado, você pode executar qualquer operação no objeto que não tenha condições prévias. Se houver uma operação com pré-condições que você deseja executar, não será possível executá-la diretamente porque você não sabe se o estado não especificado do objeto satisfaz as pré-condições.
Exemplos de operações que geralmente não têm pré-condições:
get
,empty
,size
Exemplos de operações que geralmente têm pré-condições:
Esta resposta agora aparece no formato de vídeo aqui: http://www.youtube.com/watch?v=vLinb2fgkHk&t=47m10s
fonte
char* buffer;
eint length;
membros, meu construtor / designação de movimento deve trocar (ou definir) o valor de ambos? Ou seria bom se o comprimento não fosse especificado (significando issoempty
esize
retornando valores sem sentido)?