On 25 March 2011 10:13, Rodrigo Rivas wrote: > > But now I'm a bit concerned about the complexity of this issue. Mind > me, I think that this solution is nice, but maybe it is a burden for > library implementors. > > Let's say that I want to imitate 'exactly' the behavior of the > range-for, but with a plain old for (there are plenty of reasons for > that): > template<typename C> void foo(C &c) > { > auto _b = begin(c); > auto _e = end(c); > for (auto _i = _b; _i != _e; ++_i) > { > auto _e = *_i; > //do stuff > } > } > > But this will fail sometimes for the reasons stated in N3257. If I > change the first line to: > auto _b = c.begin(); > it will fail in a lot of different cases. > So I'm forced to write a pair of functions, let's name them > 'range_begin/range_end' with a lot of SFINAE tricks to mimic the > range-for behavior. And there are a lot of subtleties and magic in the > range-for specification that makes that a hard work, if at all > possible. > > IMHO, it would be much easier if the standard library provided these > functions for me. Before, I considered that was what > std::begin/std::end did, but now...
It's FAR too late - do you want a new standard today or next year? If you want something that behaves like range-for use range-for. Or just don't use range-for, it's not essential (given the trouble it's caused I'd quite happily have lived without it in C++0x!)