C++ unique_ptr referência constante
-
23-12-2019 - |
Pergunta
Estou tentando migrar uma solução usando ponteiros para um usando unique_ptr, para simplificar a manipulação de recursos.Estou ciente de mover semântica e o uso de std::move()
para trabalhar com unique_ptr s.
Atualmente eu tenho uma função com a assinatura int foo(const T2DMatrix* m)
e eu chamo isso usando um alocada dinamicamente 2D-Matriz de objeto.A função foo
requer apenas acesso somente leitura para T2DMatrix de classe, daí o constante argumento.Agora, eu tenho migrado para este int foo(unique_ptr<const T2DMatrix>& m)
.A partir de uma função diferente, process()
, que tem um unique_ptr<T2DMatrix>
objeto (criado usando uma fábrica de função), eu quero passar o objeto foo como parâmetro.No entanto, o compilador não me permitem fazer isso.Por favor note que eu não quero transferir a propriedade do objeto a partir de process()
para foo()
, daí o uso de referências.Chamar foo() com um unique_ptr<const T2DMatrix>
funciona bem, no entanto, a constante de garantia não seria imposta, se eu alterar a função de assinatura.
Nota:uma solução que eu encontrei é criar um novo unique_ptr<const T2DMatrix>
objeto no processo de(), a transferência da propriedade para o mesmo do original unique_ptr<T2DMatrix>
objeto usando std::move()
, passá-lo para foo(), e novamente a transferência da propriedade no processo de().Mas esta não parece ser a solução ideal.
Por favor, sugira o equivalente do ponteiro solução que foi o que me permite passar um T2DMatrix* argumento para const T2DMatrix* parâmetro.Eu tentei usar msvc2012, msvc2013 e g++4.8, todos com os mesmos resultados.
Solução
Se a função não necessitam de propriedade, passar de uma simples referência, em vez de uma referência para unique_ptr
:
int foo(T2DMatrix const& m);
std::unique_ptr<T2DMatrix> matrixptr;
[...]
foo(*matrixptr);
Não há necessidade de se restringir artificialmente foo
para unique_ptr
s se a função não se preocupa com a propriedade de qualquer maneira.