See this answer for why libc++ chose forward order. As for why libstdc++ chose reverse order, that is probably because that's how it was demonstrated in the variadics template proposal, and is the more obvious implementation.
Bonus: No. These orderings have been stable in both libraries.
Update
libc++ chose forward storage order because:
- It is implementable.
- The implementation has good compile-time performance.
- It gives clients of libc++ something that is intuitive and controllable, should they care about the order of the storage, and are willing to depend on it while using libc++, despite its being unspecified.
In short, the implementor of the libc++ tuple
merely felt that storing the objects in the order the client (implicitly) specified was the quality thing to do.
tuple
layout yesterday (see PR 56785) but only to remove some empty base classes and make it more compact. The ordering of elements didn't change. – Shoe