second plus c++ c++17

c++ - second - pair c plus plus



Utilidad de std:: make_pair y std:: make_tuple en C++ 1z (1)

En C ++ 1z, ¿existe alguna situación en la que sea beneficioso usar std::make_pair y std::make_tuple lugar de usar los constructores de std::pair y std::tuple ?

Siempre hay excepciones divertidas a cada regla. ¿Qué quieres que pase con 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&>

Si quieres lo último, std::make_pair es lo que quieres.

Además, dado que std::make_pair es una plantilla de función, puede pasarla a otra plantilla de función que tal vez quiera hacer algo:

foo(std::make_pair<int, int>);

Esto no parece ser muy útil, pero alguien en algún lugar lo está utilizando para resolver un problema, y ​​no puede pasar std::pair allí.

A mi entender, la única razón de la existencia de std::make_pair y std::make_tuple es que no tiene que escribir los tipos por sí mismo, ya que se deducen automáticamente. En C ++ 1z, tenemos una deducción de argumentos de plantilla para las plantillas de clase , lo que nos permite simplemente escribir

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

en lugar de

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

La situación para std::tuple es análoga. Esto conduce a la siguiente pregunta: En C ++ 1z, ¿existe alguna situación en la que sea beneficioso usar std::make_pair y std::make_tuple lugar de usar los constructores de std::pair y std::tuple ?

Por favor, considere solo el código C ++ 1z puro (es decir, no es necesario que sea compatible con C ++ 14) y suponga que todos están familiarizados con esta característica de C ++ 1z.