Полезность 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 там.

Другие вопросы по тегам