Personally, I'd find less surprising if sub always acted as closely as
possible to ref, meaning that sub(a, 1, 2) would give a 0-d subarray
(which would somehow be like a pointer to a scalar). I understand this
would still cause confusion with dispatch, since ref would return a
scalar and sub still an AbstractArray. However, when one uses sub it
should be clear that he's opening "views" on an array, and thus always
dealing with arrays, no matter what. Also, sub with all-scalar indices
should be a special case when the indices are not known in advance,
and are generated within a function (otherwise they're pointless, I
think), meaning they would be within code which expects to an array as
outputs anyway; therefore, dispatch of 0-d subarrays shouldn't be a
real issue.
Of course I'd be perfectly fine with leaving everything like it is
now, except that I think there's a real need for the possibility of
efficiently reshaping subarrays somehow (possibly with additional
constraints w.r.t. those of array reshapes).