Frage

Als ich den Standard zu verstehen, ist ein trivialer destructor eine, die implizit deklarierte und deren Klasse nur Basis und nicht-statische Member mit trivialen Destruktoren. In Anbetracht der Rekursivität dieser Definition, so scheint es mir, dass die einzige „Rekursion stoppenden“ Zustand ist eine Basis oder ein nicht-statisches Element mit einem nicht implizit deklariert destructor (das heißt Benutzer deklariert) zu finden. Wenn das stimmt, dann bedeutet das soll, dass ein trivial destructor ist eine, die „hat noch nichts zu tun“, und daher wird es deklariert werden (implizit), aber nicht definiert. Zu sagen, es auf eine andere Weise: ist es richtig zu sagen, dass ein implizit definiert destructor (das heißt „es tut etwas“) kann gemäß der Standarddefinition nicht trivial sein

?

Sorry für die Art von dumme Frage, aber ich möchte die Dinge klären, ein bisschen in meinem Kopf ...

War es hilfreich?

Lösung

Nein. Ein implizit definiert, trivial destructor ist per Definition trivial :) Der Unterschied zwischen dem declare und definiert Dingen ist, dass damit der Compiler selbst zu sieht , dass ein destructor zur Verfügung steht, muss immer eine Erklärung. Also, wenn Sie noch kein Konto zur Verfügung stellen, wird es eine implizit liefern.

Aber jetzt wird es auch eine definieren, wenn das erforderlich ist (wenn ein Objekt dieser Klasse Typ zerstört wird). Auf jeden Fall hat es etwas zu tun: Es braucht die Destruktoren aller ihrer Mitglieder und Basisklassen zu nennen. Ein einfaches Beispiel, das die Wirkung von implizit definiert eine destructor zeigt:

struct a {
private:
    ~a();
};

struct bug {
    // note: can't be destructed
    a a_;
};

Sobald Sie versuchen, ein lokales Objekt von Bug zu schaffen, wird der Compiler einen Fehler signalisieren, weil es eine Definition eines destructor für Fehler ergibt, das die nicht zugänglich destructor eines zu nennen versucht.

Nun, ich denke, Trivialität Destruktoren / Konstrukteure meist Einschränkungen setzen auf Ihrem Programm verwendet. Objekte mit nicht-trivialen Versionen von ihnen können nicht in Gewerkschaften gesetzt werden, zum Beispiel. Auf der anderen Seite, können Sie ein Objekt mit unvollständigem Typ löschen, sofern es eine triviale destructor hat. Beachten Sie, dass, wenn Ihr Programm nicht, ob ein trivial destructor tatsächlich definiert wurde entscheiden kann, wird der Compiler definiert, es wegzulassen erlaubt. Das ist die sogenannte as-if Regel. Der Compiler hat zu verhalten, wie-wenn es Standard-konform - Optimierungen nicht egal, solange sie die Bedeutung eines Programms nicht ändern.

Andere Tipps

Ihre Formulierung ist etwas unglücklich. Z.B. die Rekursion natürlich endet auch, wenn Sie aus Mitgliedern und Basisklassen laufen. Diese Formulierung Probleme scheinen auch Sie mehr verwirrt.

Wie auch immer, alle implizit deklarierte Destruktoren, ob sie trivial sind oder nicht, wird definiert, wenn und nur wenn sie verwendet werden. Gebraucht ist ein spezifischer Begriff hier. Ein destructor vom Typ T ist verwendet , wenn die Lebensdauer eines T-Objekt endet.

Trivial Destruktoren existieren, weil C-Programmierer structs in Gewerkschaften setzen. Dieser Code sollte in C ++, so die Vorstellung von einem trivial destructor wurde erfunden, für C ++ Recht remian. Alle C structs haben triviale Destruktoren, wenn sie als C ++ kompiliert.

Betrachten Sie diese zwei Klassen:

class A {
};

class B {
private:
     A obj;
};

Die Destruktoren beiden Klassen implizit definiert. Doch zur gleichen Zeit, beide sind trivial durch die Standard-Definition.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top