https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103448
--- Comment #6 from Andrew Pinski <pinskia at gcc dot gnu.org> --- (In reply to Andrew Pinski from comment #5) > (In reply to Andrew Pinski from comment #3) > > Yes it is called the copy (or move) constructor :). > > That is: > auto t = std::tuple(std::tuple(1,2)); > std::cout << type_name<decltype(t)>() << std::endl; > > Will produce the same result. Or: auto t1 = std::tuple(1,2); auto t = std::tuple(t1); std::cout << type_name<decltype(t)>() << std::endl; There is no magic going on here, just a copy constructor happening which it looks like you forgot about.