Riferimento costante C++ unique_ptr
-
23-12-2019 - |
Domanda
Sto cercando di migrare una soluzione usando i puntatori a uno usando unique_ptr, per semplificare la gestione delle risorse.Sono a conoscenza della semantica del movimento e dell'uso di std::move()
per lavorare con unique_ptr.
Attualmente ho una funzione con la firma int foo(const T2DMatrix* m)
e lo chiamo usando un oggetto 2D-Matrix allocato dinamicamente.Funzione foo
richiede solo l'accesso in sola lettura alla classe T2DMatrix, da cui l'argomento const.Ora, ho migrato questo a int foo(unique_ptr<const T2DMatrix>& m)
.Da una funzione diversa, process()
, che ha un unique_ptr<T2DMatrix>
oggetto (creato usando una funzione factory), voglio passare l'oggetto a foo come parametro.Tuttavia, il compilatore non mi consente di farlo.Si prega di notare, non voglio trasferire la proprietà dell'oggetto da process()
per foo()
, da qui l'uso di riferimenti.Chiamare foo () con un unique_ptr<const T2DMatrix>
funziona bene, tuttavia la garanzia const non verrà applicata se cambio la firma della funzione.
Nota:una soluzione che ho trovato è creare un nuovo unique_ptr<const T2DMatrix>
oggetto in process (), trasferisci la proprietà ad esso dall'originale unique_ptr<T2DMatrix>
oggetto utilizzando std::move()
, passalo a foo (), e di nuovo trasferisci la proprietà in process ().Ma questa non sembra la soluzione ideale.
Si prega di suggerire l'equivalente della soluzione del puntatore che mi permetteva di passare un argomento T2DMatrix* al parametro const T2DMatrix*.Ho provato a usare msvc2012, msvc2013 e g++4.8, tutti con gli stessi risultati.
Soluzione
Se la funzione non richiede la proprietà, passare un riferimento semplice anziché un riferimento a unique_ptr
:
int foo(T2DMatrix const& m);
std::unique_ptr<T2DMatrix> matrixptr;
[...]
foo(*matrixptr);
Non c'è bisogno di vincolare artificialmente foo
per unique_ptr
s se la funzione non si preoccupa comunque della proprietà.