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
DDDOriginal
2024-12-13 05:01:11458Durchsuche

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
};

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!

Stellungnahme:
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