Is there a guaranted order of addresses inside a tuple?
No.
or is it implementation-defined ?
It isn't implementation defined i.e. the standard library implementation isn't required to document it. But it is unspecified by the standard and the implementation is free to use any memory order they prefer.
why is it reverse?
A typical way to implement tuple is to use recursive inheritance. It looks basically something like this:
template<class Head, class... Tail>
class tuple : tuple<Tail...>
{
Head m;
}
A reason to use such implementation is to make use of the empty base class optimisation i.e. it allows following to be true:
struct empty{};
assert(sizeof(std::tuple<empty, int>) == sizeof(std::tuple<int>));
A consequence of this is that the memory order of members is reversed.
&get<1>( tss ) - &get<0>( tss )
The behaviour of pointer arithmetic between pointers to objects that aren't elements of an array is undefined.