
Pavol Droba wrote:
What about introducing str_end() functions. The default implementation would fall-back to end(), but it can be overriden for special cases (like char[]). If we go this way however, we must remove direct suppor for null-terminated strings like char* and leave it only to str_end(). Since otherwise there will still be a bit of confusion. Naturaly, there will be need for str_size, and possibly str_begin (for consistency).
I'd name it strlen, actually. And I wouldn't fall back to end(); a string type should be marked as such by providing an appropriate overload for strlen (and strbegin/strend).
So far it seems easy. But there is a catch as usualy. There are generic facilities like FOREACH, that iterate over an arbitrary range.
It would be perfectly reasonable for a language-level foreach to omit the trailing zero when iterating over a character literal. But I don't think that this case is possible to detect. I wouldn't be surprised if it is, though, given the current wizardry in BOOST_FOREACH (somehow exploiting the fact that literals are const but convertible to char*.) But this is a special case. In general, when you see char[4] (or wchar_t[4]), you have absolutely no license to replace the 4 with undefined behavior. std::swprintf( buffer, size(buffer), L"%d", i );