
On Sep 9, 2008, at 6:39 PM, Niels Dekker - mail address until 2008-12-31 wrote:
Basically it was concluded that /if/ an assignment operator is implemented by means of copy-and-swap, it should preferably be done as follows:
T& operator=(T arg) { arg.swap(*this); return *this; }
And preferably /not/ as follows:
T& operator=(const T & arg) { T(arg).swap(*this); return *this; }
Kind regards, -- Niels Dekker http://www.xs4all.nl/~nd/dekkerware Scientific programmer at LKEB, Leiden University Medical Center
For types that take allocators (the ones most likely to benefit from swap) when the allocator follows the (new) scoped allocator model (n2606): if T uses some allocator_type and if std::allocator_propagate_on_copy_assignment<allocator_type> does not derive from std::true_type, then the function swap will do a fast- swap when *this and arg's allocators compare equal (e.g., swap the pointers to data for containers), but will do a slow copy otherwise. In this case, taking the argument by value adds an extra copy, since it is not possible to control the allocator used by the temporary (ideally, we would've liked to use this->get_allocator()). But your msg is is all good: I was going to point out it didn't work in the case described above, but your wording ("/if/ an assignment operator is implemented by means of copy-and-swap") carefully excludes this case, since it is not (always) a copy-and-swap: sometimes it is just a fast swap. So I do agree with you, but developers should probably bear the case I describe above in mind as well... Cheers, -- Hervé Brönnimann hervebronnimann@mac.com