C++ · Avançado · Inglês · Técnico
copy and swap
Idioma que implementa a atribuição recebendo o argumento por valor e trocando seu conteúdo com *this via swap. Dá garantia forte de exceção e trata a autoatribuição sem teste especial.
Onde usar
Em code review, aparece como alternativa enxuta a escrever atribuição por cópia e por movimento separadas: um único operator=(Classe o) cobre as duas. Exige um swap que não lança.
Em código
struct Buf {
int* d_; std::size_t n_;
Buf& operator=(Buf o) noexcept {
std::swap(d_, o.d_);
std::swap(n_, o.n_);
return *this; // o leva o estado antigo
}
};Exemplos
I used copy and swap to get the strong exception guarantee.
Usei copy and swap para ter a garantia forte de exceção.
With copy and swap, self-assignment just works without an if.
Com copy and swap, a autoatribuição funciona sem precisar de um if.
Cuidado
Pode ser mais lento que uma atribuição manual quando o destino já tem capacidade reaproveitável, como em std::vector.