Есть ли разница между std::pair и std::tuple только с двумя членами? (Помимо очевидного, что std::pair требуется два и только два члена, а у tuple может быть больше или меньше...)
Разница между std:: pair и std:: tuple с двумя членами?
Ответ 1
Есть некоторые различия:
std::tupleникогда не может быть по стандартному макету (по крайней мере, по стандарту это не обязательно). Каждыйstd::pair<T, Y>является стандартным макетом, если обаTиYявляются стандартным макетом.Немного легче получить содержимое
pair, чемtuple. Вы должны использовать вызов функции в случаеtuple, в то время как делоpair- просто поле члена.
Но это об этом.
Ответ 2
Это очень поздний ответ, но обратите внимание, что, поскольку std::pair определяется переменными-членами, его размер не может быть оптимизирован с помощью пустая оптимизация базового класса (first и second должны занимать разные адреса, даже если один или оба являются пустым классом). Это усугубляется любыми требованиями к выравниванию second_type, поэтому в худшем случае результирующий std::pair будет в основном в два раза больше, чем он должен быть.
 std::tuple разрешает доступ только через вспомогательные функции, поэтому он может быть получен из любого типа, если тот или иной пуст, сохраняя накладные расходы. Реализация GCC, по крайней мере, определенно делает это... вы можете пробивать заголовки, чтобы проверить это, но там также this в качестве доказательства.
Ответ 3
Имя std::tuple длиннее (один дополнительный символ). Больше этих символов набирается с правой стороны, поэтому для большинства людей это проще.
Тем не менее, std::pair может иметь только два значения - не ноль, один, три или более. ДВЕ значения. Однако кортеж почти не имеет смыслового ограничения на количество значений. Таким образом, std::pair является более точным, безопасным типом типа, если вы действительно хотите указать пару значений.
Ответ 4
Для чего это стоит, я считаю, что вывод GDB для std:: tuple гораздо труднее прочитать. Очевидно, если вам нужно больше двух значений, то std:: pair не будет работать, но я считаю это точкой в пользу структур.
Ответ 5
Обратите внимание, что с C++ 17 можно использовать один и тот же интерфейс для чтения данных из пары и кортежа с двумя элементами.
auto [a, b] = FunctionToReturnPairOrTuple();
Не нужно использовать get<> :)