Это очень поздний ответ, но обратите внимание, что, поскольку std::pair
определено с помощью переменных-членов, его размер нельзя оптимизировать с помощью пустой оптимизации базового класса (first
и second
должны занимать разные адреса, даже если один или оба - пустой класс). Это усугубляется требованиями к выравниванию second_type
, поэтому в худшем случае результирующий std::pair
будет в два раза больше необходимого.
std::tuple
разрешает доступ только через вспомогательные функции, поэтому он может быть производным от любого типа, если один или другой пуст, экономя на накладных расходах. Реализация GCC, по крайней мере, определенно делает это ... вы можете просмотреть заголовки, чтобы проверить это, но есть также этот в качестве доказательства.