Pregunta

Estoy tratando de migrar una solución con el uso de punteros a uno con unique_ptr, para simplificar el manejo de los recursos.Soy consciente de mover la semántica y el uso de std::move() para trabajar con unique_ptr del.

Actualmente tengo una función con la firma int foo(const T2DMatrix* m) y yo llamo a esto el uso de una asignación dinámica de 2D-Matriz de objetos.La función foo requiere sólo acceso de lectura a T2DMatrix de la clase, de ahí la const argumento.Ahora, he migrado a este int foo(unique_ptr<const T2DMatrix>& m).A partir de una función diferente, process(), que tiene un unique_ptr<T2DMatrix> objeto (creado con una fábrica de función), quiero pasar el objeto a foo como parámetro.Sin embargo, el compilador no me permiten hacerlo.Observe por favor, yo no quiero a la transferencia de la propiedad del objeto de process() a foo(), de ahí el uso de referencias.Llamar a foo() con un unique_ptr<const T2DMatrix> funciona bien, sin embargo la const garantía no se aplicarán si puedo cambiar la función de la firma.

Nota:una solución que he encontrado es crear una nueva unique_ptr<const T2DMatrix> objeto en proceso(), la transferencia de propiedad del original unique_ptr<T2DMatrix> objeto utilizando std::move(), pasar a foo(), y de nuevo la transferencia de la propiedad en proceso().Pero esta no parece la solución ideal.

Por favor, sugiera el equivalente de el puntero solución que fue lo que me permite pasar un T2DMatrix* argumento para const T2DMatrix* el parámetro.He intentado utilizar msvc2012, msvc2013 y g++4.8, todos con los mismos resultados.

¿Fue útil?

Solución

Si la función no requiere de propiedad, pasan a un plano de referencia, en lugar de una referencia a unique_ptr:

int foo(T2DMatrix const& m);


std::unique_ptr<T2DMatrix> matrixptr;
[...]
foo(*matrixptr);

No hay necesidad de restringir artificialmente foo a unique_ptrs si la función no se preocupa acerca de la titularidad de todos modos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top