In these situations you need to give the user some way to check the results. Either a by-reference error code, a factory function that returns a status, or a thrown exception.
...I suppose now that I've gone the route of avoiding exceptions, there is no way to return an error code from the constructor without an out parameter, and EVERY function that ever accepts external text must now have an out parameter that returns a status code.
I also would not recommend a separate validation pass, unless validation is very cheap, and conversion very expensive.
Then how do I establish the invariant that the text is now valid, if I don't check? Which validation is superfluous? If you are referring to what the caller would do to make sure the data is valid, they could
validate or sanitize
the data; one reports error if it is invalid, one would provide a valid string, even if the input is invalid.
I kind of feel like this is all going backwards on what was said previously.