c++ - español - ¿Beneficios de usar reference_wrapper en lugar de puntero en bruto en contenedores?
c++ reference (2)
Las referencias de C son realmente problemáticas al trabajar con plantillas. Si tiene la "suerte" de compilar el código con referencia como parámetro de plantilla, podría tener problemas con el código que funcionaría (por alguna razón) de la siguiente manera:
template<class T> f(T x) { g(x); }
template<class T> g(T x) { x++; }
Entonces, incluso si llama a f<int&>(x)
llamará a g<int>
. Pero reference_wrapper
funciona bien con plantillas.
Como también se mencionó anteriormente, tendrá problemas para compilar cosas como vector<int&>
, pero vector<reference_wrapper<int>>
funciona bien.
¿Qué beneficios tiene el uso de std::reference_wrapper
como parámetro de plantilla de contenedores en lugar de punteros en bruto? Eso es std::vector<std::reference_wrapper<MyClass> >
vs. std::vector<MyClass*>
Me gusta olvidarme de los valores nulos y no tener que usar la sintaxis del puntero, pero la verbosidad de los tipos (es decir, vector<reference_wrapper<MyClass> >
) además de tener el sitio de llamada usando std :: ref para envolver la referencia real me hace pensar que no es vale la pena.
Me refiero a los casos en los que el uso de std :: shared_ptr o cualquier otro puntero inteligente no es una opción.
¿Hay otros beneficios de usar reference_wrapper o algún otro factor que no esté teniendo en cuenta actualmente? (Creo que mi pregunta se aplica tanto a la referencia_wrapper como a la de boost de C ++ 11)
No creo que haya ninguna diferencia técnica . El envoltorio de referencia proporciona una funcionalidad de puntero básica, incluida la posibilidad de cambiar el objetivo de forma dinámica.
Un beneficio es que demuestra la intención. Le dice a la gente que lee el código que "quienquiera" tiene la variable, en realidad no está controlando su vida útil. El usuario no ha olvidado eliminar o hacer algo nuevo, lo que algunas personas pueden comenzar a buscar cuando ven la semántica de punteros.