On Wed, Mar 23, 2011 at 5:46 PM, Jason Merrill <ja...@redhat.com> wrote:
> Yep.  Here is the wording that we approved today:
[snip]

Nice. Thank you.
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...

--
Rodrigo

Reply via email to