The way to support the strong exception safety guarantee it to ensure that nothing is updated until we’ve executed all the step that might throw an exception.
This means taking copies of subobjects and making the changes on the copies, prior to swapping the state between the copies and the original subobjects.
[This is the reason that non-throwing swapping is so important.]