https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84855
--- Comment #5 from Hannes Hauswedell <h2+bugs at fsfe dot org> --- Sure, that follows from the definition "For each identifier, a variable whose type is "reference to std::tuple_element<i, E>::type" is introduced". This wouldn't have to be implemented like this, though... My original intuition (and probably that of others) was that auto CR [ a, b ] = f; leads to auto CR a = std::get<0>(f); auto CR b = std::get<1>(f); where CR can be "", "&", "&&" or "const &". Instead something like this happens: auto CR e = f; auto && a = std::get<0>(e); auto && b = std::get<1>(e); I assume this design was chosen to be able to materialise temporaries and I don't see an obvious way of handling that with a different design. But I still feel like it is less intuitive in the general case and in my case also prevents the plan (because I explicitly don't want perfect forwarding). But that's a different matter and I will stop wasting your dev time ;-)