Yes it should be _equal()
Excellent solution, actually. Didn't think of that.
That is, it probably still shouldn't throw errors, since equal() can be used on arbitrary structures too, and there might be cases when the caller doesn't know what things it might encounter during its recursion. But it's still an excellent idea to use _equal instead of `==, so that == can be used to check whether the arguments are the same iterator.