Heim > Backend-Entwicklung > C++ > Warum schlägt „std::unique_ptr' mit unvollständigen Typen in Pimpl Idiom fehl?

Warum schlägt „std::unique_ptr' mit unvollständigen Typen in Pimpl Idiom fehl?

DDD
Freigeben: 2024-12-13 05:01:11
Original
458 Leute haben es durchsucht

Why Does `std::unique_ptr` Fail with Incomplete Types in Pimpl Idiom?

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
};
Nach dem Login kopieren

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
};
Nach dem Login kopieren

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!
}
Nach dem Login kopieren

Außerdem schlägt die Verwendung von unique_ptr mit unvollständigen Typen im Namespace-Bereich fehl:

class impl;
std::unique_ptr<impl> impl_;
Nach dem Login kopieren

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_;
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage