Opaque result types

This is only true within a module, and not across resilience boundaries. You’re completely correct that the compiler should be able to optimise that within a module, but what about the scenario where the calling module can’t be allowed to know ArrayIterator exists or depend upon the returned type always being ArrayIterator?

The idea of ABI stability is that dependencies should be able to change their implementation (including what types they return) without the dependant code having to recompile. That doesn’t work if the ABI is locked to specific types.