Should we always implement the “Strong” guarantee? I think you’ve seen enough to realise that it is possible.
But the strong guarantee is costly in resources (more memory for the temporaries, more code to manipulate them, more time to execute them).
[FWIW “deleteable” is even cheaper to implement - but it makes client code more complex and can impact system stability and maintenance costs. I might use this in classes used internally by a library, but not in interfaces the client code sees.]
Whatever decision you make, the user of the code needs to know and understand it.
Currently, the language has no direct support for validating exception safety and I know of no automated tools that help. (In fact the support that does exist - such as throw declarations - is actively unhelpful.)
Choosing the right design is a matter of negotiation between the users of the class and the implementer.
Validating the implementation is a topic to be addressed in code reviews.