http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49022
--- Comment #19 from Jonathan Wakely <redi at gcc dot gnu.org> 2011-06-14 13:01:24 UTC --- Ah, no the problem is std::__addressof<const _Tp>(__ex()[0]) which takes the address of a temporary returned by operator[] The range-based for seems to do the right thing