I'm not convinced the copy-and-swap idiom is of any benefit here -- in fact, I think it makes things slightly worse:

1. You are now calling shared_ptr's move assignment operator THREE times instead of just once, since the implementation of std::swap looks like this:

template <class T> void swap (T& a, T& b)
{
  T c(std::move(a)); a=std::move(b); b=std::move(c);
}

This is actually somewhat expensive, since shared_ptr's move assignment must take care of destroying the old resource when the reference count reaches 0

2. Code is harder to read/understand, since you have to notice that other is being passed by value.

3. You don't really get any added exception safety, since if bam_deep_copy() throws in the previous implementation we wouldn't be in an inconsistent state.

So in this case copy-and-swap is slower, harder to read, and provides no extra exception safety. I think we should restore the previous implementation.