
Obviously, any compound type with a member in an invalid state is in an invalid state too.
There's no point in sending examples if you're going to snip them and then only comment on them in part. And what you said is not true. If in this example my string class has a member char * _mem which is 0, I can reliably inform the user that the string is empty. But now we're getting too phylosophical and moving away from the discussion.
The default-constructed state of a string class is a perfectly valid state, that's totally unrelated.
My point was that a default constructed range may be in a perfectly valid state, too, depending on its iterators.
It's not cutting out specific ranges, it just requires you to explicitly initialize all ranges before using them, to ensure you're not doing something wrong.
Which, among other things, makes it more awkward to use for the consumers of the library.
The one that will make the decision of changing Boost.Range to reflect your desires or not is most likely the maintainer of that library and my opinion on this matter matters little.
Which is a shame - I think you raised some valid points.