https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91780
--- Comment #7 from Jonathan Wakely <redi at gcc dot gnu.org> --- Before that commit, the zip(as, bs) deduced the type as zip<vector<int>, vector<int>>, rather than zip<vector<int>&, vector<int>&>. So: (In reply to Mikael Persson from comment #0) > GCC does not change values in tuple of references Is wrong. There isn't a tuple of references there at all, that's why the changes were not visible in the original obejcts. The zip created its own copies, and then those were modified.