
So you do not consider the fact the following code compiles (and runs!) cleanly as a painful problem?
std::string s = get_utf8_string(); s[42] = '?';
It is fine code. Why? Because if you assign s[42] you probably know why you are do it and you most likely know that there is a some ASCII character there. Like for example s=get_some_utf8_text_code(); for(size_t i=0;i<s.size();i++) { switch(s[i]) { case: '\r': case: '\n': case: '\t': s[i]=' '; } } Something very common and useful for text parsing. Is this code wrong? No! If fast there is lots of code that works fine with this. removing operator[] does not solve **any** problem.
I consider that std::string is cool as an internal for a Boost.Locale implementor, not as a standard API for encoded strings that should be used by all C++ developpers.
Seems to me you hadn't seen Boost.Locale code and what does it does. Artyom