Reconsider copy-and-swap to reduce calls to shared_ptr move assignment