Difference between std::pair and std::tuple with only two members?
There are some differences:
std::tuple
is not required by the standard to ever be standard-layout. Everystd::pair<T, Y>
is standard-layout if bothT
andY
are standard-layout.It's a bit easier to get the contents of a
pair
than atuple
. You have to use a function call in thetuple
case, while thepair
case is just a member field.
But that's about it.
An std::tuple
's name is longer (one extra character). More of those characters are typed with the right hand, so easier for most people to type.
That said, std::pair
can only have two values - not zero, one, three or more. TWO values. A tuple, however, has almost no semantic limitation on the number of values. An std::pair
, therefore, is a more accurate, type safe type to use if you actually want to specify a pair of values.
This is a very late answer but note that, because std::pair
is defined with member variables, its size cannot be optimized using empty base class optimization (first
and second
must occupy distinct addresses, even if one or both is an empty class). This exacerbated by whatever alignment requirements second_type
has, so in the worst case the resulting std::pair
will be basically twice the size it needs to be.
std::tuple
only allows access through helper functions, so it's possible for it to derive from either type if one or the other is empty, saving on the overhead. GCC's implementation, at very least, definitely does this...you can poke through the headers to verify this but there's also this as evidence.