On Thursday, 5 February 2015 at 10:36:34 UTC, Eduardo Pinho wrote:
Some assistance on understanding what is wrong here is greatly appreciated.

There's definitely nothing wrong with your code.

I always thought foreach preferred opApply when available because internal iteration can in theory be faster than external iteration (although it rarely is with current compilers because the indirect call to the delegate is often the bottleneck), but as you've pointed out, the specification claims external iteration is be preferred. Either the specification has to be changed, or the compiler has to be changed.

If internal iteration remains preferred, `find` should probably be changed to use an explicit for-loop:
---
    size_t i = 0;
    for (auto h = haystack.save; !h.empty; h.popFront())
    {
        if (predFun(h.front))
            return haystack[i .. $];
        ++i;
    }
    return haystack[$ .. $];
---
(`haystack` is known to be a forward range in this portion of the code)

However, this would set a possibly disruptive precedent that range algorithms must no longer use foreach on aggregate types...

Reply via email to