Basically, a zero-length match isn't allowed to occur at the same position twice, whether in successive scalar matches or a single list context match. In addition to pos() being saved for each scalar, there's a flag that says whether it was zero-length or not. This is documented in http://search.cpan.org/perldoc/perlre#Repeated_patterns_matching_zero-length_substring.
The flag can be cleared if needed by setting pos: pos($foo) = pos($foo).