2012-03-16 8 views
6

En referencia a esta página web http://www.cplusplus.com/reference/std/utility/make_pair/¿Por qué std :: make_pair recibe entrada por valor en lugar de por referencia constante?

El std :: make_pair tiene esta firma (y posible implementación):

template <class T1,class T2> 
pair<T1,T2> make_pair (T1 x, T2 y) 
{ 
    return (pair<T1,T2>(x,y)); 
} 

Me pregunto por qué std :: make_pair tiene parámetro de entrada por valor y no por la const referencias?

¿Hay alguna razón en particular para esto?

+0

Curiosamente http://www.sgi.com/tech/stl/pair.html make_pair toma argumentos por valor, pero el estándar los define como pasar por el valor –

+0

Es [todo mejor en C++ 11] (http : //en.cppreference.com/w/cpp/utility/pair/make_pair). Todas tus preocupaciones son transitorias y pronto irrelevantes. –

+0

desde la misma página "los objetos de pares se pueden copiar de otros objetos de pares que contengan tipos diferentes, si los tipos respectivos son implícitamente convertibles". – PermanentGuest

Respuesta

6

Originalmente era tomando los parámetros por const reference, pero eso introdujo algunos problemas inesperados. Fue cambiado a paso por valor después de un informe de defectos:

http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#181

Se espera que el compilador inline la función y ser capaz de optimizar el paso de parámetros de distancia la mayor parte del tiempo.

3

Para que std::make_pair("abc", 3) funcione. Si std::make_pair tomó una referencia, el tipo deducido para T1 sería char const[4], lo que generaría todo tipo de mensajes de error extraños porque no se puede copiar.

Cuestiones relacionadas