Wenn Ihre Klasse niemals leer sein soll, ist ein nicht-konstantes eindeutiges ptr (mit Standardverschiebung/-zuweisungen) nicht geeignet. Die Bewegungen ctor und move assign werden beide rhs leeren.
Ein const unique ptr wird diese automatischen Methoden deaktivieren, und wenn Sie verschieben möchten, müssen Sie es innerhalb der impl schreiben (und ein bisschen Kleber außerhalb).
Ich würde persönlich einen Wert ptr mit der Semantik schreiben, die ich will (dann Compiler schreiben den Kleber), aber mit einem const unique_ptr klingt vernünftig als erster Durchlauf.
Wenn Sie das nie-leere entspannen und es fast nie-leer machen, müssen Sie nun über die Vorbedingungen vieler Methoden und mögliche Bug-on-Bugs nachdenken.
Die größten Kosten dieser Technik, Schwierigkeiten bei der Rückgabe von Werten, gehen mit C++ 17 verloren.
Ohne die Rede gelesen zu haben, ist es offensichtlich, dass Klassen mit Pimpl nicht kopierbar/beweglich sind. Sie würden in dynamischem Umfang instanziiert und ausschließlich über intelligente Zeiger aufgerufen, wobei pimpl die internen Implementierungsdetails verbergen würde. –
Warum willst du nicht, dass die Mehrheit deiner Pimpl Klassen beweglich ist?Es scheint eine vollkommen vernünftige Sache zu sein. –
@DenisYaroshevskiy kann nur annehmen, dass er einen bestimmten Anwendungsfall im Sinn hat. Im Allgemeinen stimme ich der Verwendung von "unique_ptr" als Container für pimpl zu. Wenn Sie möchten, dass es kopierbar ist, müssen Sie dies natürlich in Bezug auf einen Klonvorgang implementieren. –