2016-09-27 1 views
12

Ich möchte klar machen, dass der Konstruktor meiner Klasse A Besitz des übergebenen Data Parameter übernehmen wird. Die offensichtliche Sache zu tun ist, ein unique_ptr von Wert annehmen:Nehmen Sie Besitz von Parameter von rvalue-Referenz

class A 
{ 
public: 
    A(std::unique_ptr<Data> data) : _data(std::move(data)) { } 

    std::unique_ptr<Data> _data; 
}; 

jedoch für meinen Anwendungsfall gibt es keinen Grund, warum Data sollte ein Zeiger sein, da ein Werttyp ausreichen würde. Die einzige verbleibende Option, die ich denken konnte, um wirklich deutlich zu machen, dass Data wird von A Besitz ist Pass von rvalue Verweise:

class A 
{ 
public: 
    A(Data&& data) : _data(std::move(data)) { } 

    Data _data; 
}; 

Ist dies eine gültige Weise Eigentum zu signalisieren, oder gibt es bessere Möglichkeiten, dies zu tun ohne unique_ptr zu verwenden?

+0

Warum übernimmt der ctor das Eigentum? –

+2

Ich würde den Konstruktor explizit machen –

+1

@IvanRubinson Aus mehreren Gründen, wie Dependency Injection. –

Antwort

4

Ja, ich denke, es ist ein gültiger Weg.

Im Fall von unique_ptr ist es nicht kopierbar, so dass keine Gefahr besteht, dass jemand versehentlich eine Kopie erstellt, wenn dies nicht der Fall war, so dass sowohl der Wert als auch der Wert als Referenzwert gelten Besitz ergreifen.

Im Fall von Data, Pass-by-Rvalue-Referenz-Dokumente, die Sie übernehmen Eigentum und es besteht keine Gefahr des Anrufers versehentlich eine Kopie, wenn sie nicht beabsichtigte, zu machen.

2

Ja, es ist ein gültiger Weg. Sie können es auch nach Wert übergeben:

class A { 
    A(Data data) : _data(std::move(data)) { } 
}; 
Data data; 
A a(std::move(data)); 
+2

Natürlich ist dies auch eine Option. Es erzwingt jedoch nicht, das Objekt zu verschieben, und daher können unnötige Kopien erstellt werden. –

+2

@angelag In diesem Fall denke ich, dass ein pass-by-value eine bessere Option sein könnte. Wenn Sie wollen, dass 'Data' immer nur EINEN Eigentümer hat, dann sollten Sie es nicht kopierbar machen und' Daten' nach Wert übergeben, so wie Sie es mit 'eindeutiger_Ptr' gemacht haben. Andernfalls, d. H. "Daten" können kopiert werden, gibt der Übergabewert dem Client zwei Möglichkeiten: Kopieren oder Verschieben. Es ist flexibler, und manchmal möchte der Client eine Kopie von 'Data' behalten, nachdem er sie an' A's Konstruktor übergeben hat. –

Verwandte Themen