See my earlier comment on the Cigar class operator=: by using copy-and-swap here you are making things slower (3 calls to shared_ptr move assignment instead of just 1), harder to read, and not getting any extra exception safety. We should restore the previous implementation.