2014-12-21 10 views
7

Przeszedłem niektóre kodu źródłowego C++ from a library związane z projektu zwierząt domowych, nad którym pracuję i napotkałem coś, czego nie rozumiem. W miejscu, gdzie spodziewałem się dereference wskaźnika następuje w drodze cesji, autorzy biblioteki użyć std::swap() pod koniec funkcji, aby zapisać wynik:przy użyciu std :: swap zamiast przydziału z operatorem "="

std::swap(*out, result);

Spodziewałem się zobaczyć coś takiego:

*out = result;

Zauważ, że result jest typedef z size_t i out jest wskaźnikiem do tego samego typu.

Jeśli chodzi o "programowanie systemów", moje tło jest w C i C#, ale niewiele w C++. Czy istnieje jakiś szczególny powód tego rodzaju "zadania"?

+1

Jeśli wartość 'result' jest * nie * używana po zamianie,' std :: move' może być lepszym wyborem. Zobacz także [Czym dokładnie jest wartość R w C++?] (Http://stackoverflow.com/q/9406121/608639). – jww

+0

@jww, 'wynik' nie jest używany po wywołaniu' std :: swap'. – easuter

Odpowiedz

9

Gdy wartości są bardziej interesujące, np. std::vector<T>, na przykład może być bardziej zrozumiały dla std::swap() tymczasowo skonstruowany obiekt na miejscu zamiast przypisywania go: biorąc pod uwagę, że tymczasowy wynik wkrótce zniknie, unikając zadanie i zmiana wskaźników są sensowne. Nie widzę powodu, aby robić coś takiego z podstawowymi typami, takimi jak std::size_t.

+0

OK, dzięki za odpowiedź! – easuter

+3

** + 1 ** za zwięzłą odpowiedź. Lub, w C++ 11, można użyć semantyki ruchu, aby pozbyć się zadania. Zwracam uwagę, że konstrukcja 'swap' jest często widoczna w idiomie copy-and-swap http://stackoverflow.com/q/3279543/3093378, gdy chcesz się upewnić, że nie pozostawiasz obiektów w nieokreślonym stwierdza, gdy kopiujesz je z powodu rzucania wyjątków. – vsoftco

Powiązane problemy