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

Полезность std:: make_pair и std:: make_tuple в С++ 1z

По моему мнению, единственная причина существования std::make_pair и std::make_tuple заключается в том, что вам не нужно писать типы самостоятельно, поскольку они автоматически выводятся. В С++ 1z мы имеем вывод аргумента шаблона для шаблонов классов, который позволяет просто написать

std::pair p(1, 2.5); // C++1z

вместо

auto p = std::make_pair(1, 2.5); // C++11/14

Ситуация для std::tuple аналогична. Это приводит к следующему вопросу: в С++ 1z существует ли ситуация, когда полезно использовать std::make_pair и std::make_tuple вместо использования конструкторов std::pair и std::tuple?

Пожалуйста, рассмотрите только чистый код С++ 1z (т.е. не нужно иметь обратную совместимость с С++ 14) и предположите, что все знакомы с этой функцией С++ 1z.

4b9b3361

Ответ 1

В С++ 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 там.