Czy dobrą praktyką powszechną jest zawsze wdrażanie moich operatorów przydziału przypisania przy użyciu numeru std::swap
? Rozumiem, że jest to sposób na udostępnienie implementacji konstruktora kopii. Chciałbym uniknąć duplikowania samej logiki kopiowania. Więc tutaj jest to, co bym zrobił:Czy operator kopiowania powinien generalnie korzystać ze std :: swap?
class Foo
{
public:
Foo(Foo const& other) { /* assume valid implementation */ }
Foo& operator= (Foo other)
{
std::swap(*this, other);
return *this;
}
};
Akt przejściu „inne” do preform operator przypisania skopiować konstrukcję (mamy wspólną logikę kopiowania w tym momencie). Zakładam, że zamiana spowoduje wywołanie konstrukcji przeniesienia (która ma tutaj implementację wygenerowaną przez kompilator).
Robię to praktycznie dla każdej klasy, w której implementuję budowę kopii, ponieważ konstruktor & nigdy nie ma innych implementacji.
Tak, kopiowanie i zamiana idiomu jest dobre dla każdej klasy posiadającej zasoby. Kolejną korzyścią jest silna gwarancja wyjątku, którą otrzymujesz z wymiany.Bycie "ogólną zasadą" dla bazy kodu, jeśli bardziej opartej na opiniach, imo. – quantdev
Powinieneś używać 'use namespace std;' before 'swap' i usuń' std :: '. W ten sposób używa się bardziej specyficznego 'swap' jeśli jest dostępny. Poza tym jest to dość standardowe. – nwp
Niektórzy twierdzą, że implementacja funkcji specjalnych członków w kategoriach 'swap' nie jest optymalna. Istnieje kilka niepotrzebnych przydziałów, ponieważ 'swap' wprowadza' inny' do określonego stanu. Również operatorzy przydzielający, którzy zapewniają silną gwarancję wyjątku, mogą być pesymizacją: użytkownik może nie potrzebować tej gwarancji, ale w każdym przypadku zapłaci za nią. – dyp