Con el fin de mejor a peor:
- algunaFuncion (const T &);
- someFunction (T &);
- someFunction (const std :: unique_ptr <T> &);
- someFunction (std :: unique_ptr <T> &);
La primera es la mejor porque no modifica el objeto y funcionará con el objeto sin importar cómo lo haya asignado (por ejemplo, podría cambiar a shared_ptr sin problemas).
El número dos también funcionará independientemente de qué puntero inteligente esté utilizando; sin embargo, asume que puedes modificar el objeto, y siempre que puedas hacer algo const, deberías.
Los números 3 y 4 permiten que el objeto señalado sea mutado; sin embargo, # 3 no permite que se modifique el puntero inteligente, mientras que el número 4 sí lo hace. Ambos tienen la desventaja de que fuerzan el uso de unique_ptr, mientras que los dos anteriores funcionarían independientemente de la clase de puntero inteligente.
Al pasar un unique_ptr por valor, como lo ha hecho en algunos de los otros ejemplos, no es una opción; se supone que unique_ptr es único. Si está copiando, considere usar shared_ptr.
Para los dos primeros, si se invocó en el resultado de la espalda(), que se vería así:
someFunction(*(lst.back())); // dereference lst.back() before passing it in.
Para los dos últimos, si lo invocó en la resut de la espalda(), que se vería así:
someFunction(lst.back()); // pass the smart pointer, not the object to
// which the smart pointer currently points.
Gracias por la explicación en profundidad. Por lo tanto, no es necesaria ninguna semántica especial para los punteros inteligentes (excepto la desreferenciación). Sabía sobre las cosas 'const', pero en este caso necesito modificar el objeto' T' que se ha pasado. – rubenvb