Boost logo

Boost :

Subject: Re: [boost] [move][container] Review Request (new versions ofBoost.Move and Boost.Container in sandbox and vault)
From: Howard Hinnant (howard.hinnant_at_[hidden])
Date: 2009-09-07 18:19:19


On Sep 7, 2009, at 6:03 PM, David Abrahams wrote:

>
> on Mon Sep 07 2009, "Peter Dimov" <pdimov-AT-pdimov.com> wrote:
>
>>> Rationale:
>>> The move assignment operator should be fast enough that an extra if-
>>> test may adversely impact performance (above the noise level).
>>
>> The problem with making it UB is that y = move(x) now needs to be
>> guarded with if( &x
>> != &y ) everywhere in client code. Sometimes the user will know
>> that x is not y, but
>> is this really the case most of the time?
>
> Most of the time, yeah. Definitely, in most of the generic
> algorithms.
> But I'm not sure whether it's true enough of the time. Consider our
> new
> generic std::swap:
>
> template <class T>
> void swap(T& x, T& y)
> {
> T z = std::move(x);
> x = std::move(y); // <== uh oh?
> y = std::move(z);
> }
>
> Do we think swap(x,y) is also an error when x == y?

This is a decent argument to not assert in self-move-assignment. But
this is also almost certainly harmless:

#include <algorithm>
#include <iostream>

class A
{
     int data_;
public:
     explicit A(int data = 0) : data_(data) {}
     A(A&& a) : data_(a.data_) {a.data_ = 0;}
     A& operator=(A&& a) {data_ = a.data_; a.data_ = 0; return *this;}
     friend std::ostream& operator<<(std::ostream& os, const A& a)
     {
         return os << a.data_;
     }
};

int main()
{
     A a(5);
     std::cout << "Before swap a = " << a << '\n';
     std::swap(a, a);
     std::cout << "After swap a = " << a << '\n';
}

Before swap a = 5
After swap a = 5

But if I caught my own code doing a self-swap, yeah, I would treat it
as a bug and correct it. For example, every time I've written reverse
(which does nothing but swap x and y while x and y move closer to each
other in the sequence), I'm careful to break out of the loop before &x
== &y.

-Howard


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk