C ++ unique_ptr Konstante Referenz

7

Ich versuche, eine Lösung mithilfe von Zeigern zu einer mit unique_ptr zu migrieren, um die Ressourcenbehandlung zu vereinfachen. Ich bin mir bewusst, bewegen Semantik und die Verwendung von std::move() mit unique_ptrs arbeiten.

Zur Zeit habe ich eine Funktion mit der Signatur int foo(const T2DMatrix* m) und rufe diese mit einem dynamisch zugeordneten 2D-Matrix-Objekt auf. Die Funktion foo benötigt nur den schreibgeschützten Zugriff auf die Klasse T2DMatrix, daher das Argument const. Jetzt habe ich dies nach int foo(unique_ptr<const T2DMatrix>& m) migriert. Von einer anderen Funktion, process() , die ein Objekt unique_ptr<T2DMatrix> hat (erstellt mit einer Factory-Funktion), möchte ich das Objekt als Parameter an foo übergeben. Der Compiler erlaubt mir dies jedoch nicht. Bitte beachten Sie, dass ich das Eigentumsrecht des Objekts nicht von process() auf foo() übertragen möchte, daher die Verwendung von Referenzen. Das Aufrufen von foo () mit unique_ptr<const T2DMatrix> funktioniert gut, die const-Garantie wird jedoch nicht erzwungen, wenn ich die Funktionssignatur ändere.

Hinweis: Eine Lösung, die ich gefunden habe, besteht darin, ein neues unique_ptr<const T2DMatrix> -Objekt in process () zu erstellen, den Besitz vom ursprünglichen unique_ptr<T2DMatrix> -Objekt mit std::move() zu übertragen und es an foo () weiterzuleiten Eigentumsrecht in Prozess übergeben (). Aber das scheint kaum die ideale Lösung zu sein.

Bitte schlagen Sie das Äquivalent der Zeigerlösung vor, die es mir ermöglichte, ein T2DMatrix * Argument an const T2DMatrix * Parameter zu übergeben. Ich versuchte mit msvc2012, msvc2013 und g ++ 4.8, alle mit den gleichen Ergebnissen.

    
Ankur Kanoria 27.02.2014, 09:23
quelle

1 Antwort

19

Wenn die Funktion keine Eigentumsrechte erfordert, übergeben Sie einen einfachen Verweis anstelle eines Verweises auf unique_ptr :

%Vor%

Es besteht keine Notwendigkeit, foo auf unique_ptr s künstlich zu beschränken, wenn die Funktion sich sowieso nicht um den Besitz kümmert.

    
ComicSansMS 27.02.2014, 09:27
quelle

Tags und Links