Подтвердить что ты не робот

Почему std:: pair <A, B> не совпадает с std:: tuple <A, B>? (Неужели нет способа?)

Почему std::pair<A,B> не совпадает с std::tuple<A,B>? Всегда было странно не быть способным просто подставить друг друга. Они несколько конвертируемые, но есть ограничения.

Я знаю, что std::pair<A,B> требуется иметь два элемента данных A first и B second, поэтому он не может быть просто псевдонимом типа std::tuple<A,B>. Но моя интуиция говорит, что мы могли бы специализировать std::tuple<A,B>, то есть кортеж с ровно двумя элементами, чтобы равняться определению того, что стандарт требует std::pair. А затем перейдем к std::pair.

Я предполагаю, что это было бы невозможно, так как слишком прямолинейно, чтобы не думать об этом, но это не было сделано в g++ libstdС++, например (я не смотрел исходный код других библиотек). Какова будет проблема этого определения? "Просто", что он нарушит стандартную бинарную совместимость библиотек?

4b9b3361

Ответ 1

Вы должны быть осторожны с такими вещами, как SFINAE и перегрузкой. Например, приведенный ниже код в настоящее время хорошо сформирован, но вы сделали бы его незаконным:

void f(std::pair<int, int>);
void f(std::tuple<int, int>);

В настоящее время я могу устранить неоднозначность между парой и кортежем посредством разрешения перегрузки, SFINAE, специализации шаблонов и т.д. Эти инструменты все равно станут несовместимыми с ними, если вы сделаете их одинаковыми. Это нарушит существующий код.

Возможно, появилась возможность представить его как часть С++ 11, но, безусловно, этого не происходит.

Ответ 2

Это чисто исторический. std::pair существует с С++ 98, тогда как кортеж пришел и первоначально не был частью стандарта.

Обратная совместимость - самая большая нагрузка для развития С++, что позволяет легко справляться с некоторыми приятными делами!

Ответ 3

Я не пробовал это и сейчас не имею пропускную способность. Вы можете попробовать сделать специализацию std:: tuple, полученную из sd:: pair. Кто-то, пожалуйста, скажите мне, что это не сработает или будет особенно ужасной идеей. Я подозреваю, что у вас возникнут проблемы с аксессуарами.