std::unique_ptr und unvollständige Typen: Ein tieferer Blick
Betrachten Sie das Pimpl-Idiom unter Verwendung von std::unique_ptr:
class window { window(const rectangle& rect); private: class window_impl; // defined elsewhere std::unique_ptr<window_impl> impl_; // won't compile };
Allerdings kommt es aufgrund einer Unvollständigkeit zu einem Kompilierungsfehler type:
"Ungültige Anwendung von 'sizeof' auf einen unvollständigen Typ 'uixx::window::window_impl'"
Traditionell ist std::unique_ptr mit unvollständigen Typen kompatibel. Wo liegt also das Problem?
Der Kern der Sache: Zerstörung
Der Schlüssel liegt in der Zerstörung. Wenn pimpl mit unique_ptr verwendet wird, muss der Destruktor explizit deklariert werden:
class foo { class impl; std::unique_ptr<impl> impl_; public: foo(); // Constructor may need external definition ~foo(); // Implement (braceless or with = default;) once impl is complete };
Wenn nicht, generiert der Compiler einen Standarddestruktor, der eine vollständige Deklaration von foo::impl erfordert.
Template-Probleme und Instanzen mit statischer Dauer
Bei Template-Konstruktoren treten Komplikationen auf, selbst wenn die impl_-Mitglied ist nicht konstruiert:
template <typename T> foo::foo(T bar) { // Compiler requires knowledge of impl_ destruction at compile time! }
Außerdem schlägt die Verwendung von unique_ptr mit unvollständigen Typen im Namespace-Bereich fehl:
class impl; std::unique_ptr<impl> impl_;
Der Compiler muss wissen, wie dieses statische Dauerobjekt zerstört wird. Eine Problemumgehung besteht darin, einen benutzerdefinierten Typ zu definieren:
class impl; struct ptr_impl : std::unique_ptr<impl> { ~ptr_impl(); // Implement (empty body) elsewhere } impl_;
Das obige ist der detaillierte Inhalt vonWarum schlägt „std::unique_ptr' mit unvollständigen Typen in Pimpl Idiom fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!