Полезность std::make_pair и std::make_tuple в C++1z
В моем понимании, единственная причина существования std::make_pair
а также std::make_tuple
является то, что вам не нужно писать типы самостоятельно, поскольку они автоматически выводятся. В C++1z у нас есть вычет аргументов шаблона для шаблонов классов, который позволяет нам просто писать
std::pair p(1, 2.5); // C++1z
вместо
auto p = std::make_pair(1, 2.5); // C++11/14
Ситуация для std::tuple
аналогично. Это приводит к следующему вопросу: есть ли в C++1z ситуация, в которой полезно использовать std::make_pair
а также std::make_tuple
вместо использования конструкторов std::pair
а также std::tuple
?
Пожалуйста, рассмотрите только чистый код C++1z (т.е. нет необходимости обратной совместимости с C++14) и предположите, что все знакомы с этой функцией C++1z.
1 ответ
В C++1z, есть ситуация, в которой это выгодно использовать
std::make_pair
а такжеstd::make_tuple
вместо использования конструкторовstd::pair
а такжеstd::tuple
?
Всегда есть забавные исключения из каждого правила. С чем ты хочешь случиться std::reference_wrapper
?
int i = 42;
auto r = std::ref(i);
pair p(i, r); // std::pair<int, std::reference_wrapper<int> >
auto q = std::make_pair(i,r); // std::pair<int, int&>
Если вы хотите последнее, std::make_pair
это то, что вы хотите.
Кроме того, так как std::make_pair
это шаблон функции, вы можете передать его в другой шаблон функции, который, возможно, захочет что-то сделать:
foo(std::make_pair<int, int>);
Это не кажется супер полезным, но кто-то где-то использует это для решения проблемы - и вы не можете просто передать std::pair
там.