Frage

In C ++ den folgenden Code gibt einen Compiler-Fehler:

void destruct1 (int * item)
{
  item->~int();
}

Dieser Code ist fast das gleiche, ich habe gerade typedef die int auf eine andere Art und etwas Magie passiert:

typedef int myint;

void destruct2 (myint * item)
{
  item->~myint();
}

Warum funktioniert die zweite Code Arbeit? Hat ein int eine destructor bekommen, nur weil es hat typedefed worden?

Für den Fall, fragt man sich, warum man überhaupt, dies tun möchte: Das kommt von Refactoring C ++ Code. Wir Entfernen des Standard-Heap und es mit Eigenbau-Pools zu ersetzen. Dies erfordert, dass wir placement-neu und die Destruktoren zu nennen. Ich weiß, dass Destruktoren für primitive Typen ist nutzlos, aber wir wollen, dass sie in dem Code trotzdem für den Fall, fordern wir später PODs ersetzen mit echten Klassen.

Herauszufinden, dass nackt int arbeiten, nicht aber typedefed diejenigen eine ziemliche Überraschung tun war.

Btw - Ich habe eine Lösung, die Template-Funktionen beinhaltet. Wir haben gerade typedef in der Vorlage und alles ist in Ordnung.

War es hilfreich?

Lösung

Es ist der Grund, dass der Code Arbeit für generische Parameter macht. Betrachten wir einen Behälter C:

template<typename T>
struct C {
    // ...
    ~C() {
        for(size_t i = 0; i<elements; i++)
            buffer[i].~T();
    }
};

Es wäre ärgerlich Sonderfälle für integrierte Typen einzuführen. So C ++ können Sie die oben genannten tun, auch wenn T gleich passiert int. Die heilige Norm sagt in 12.4 p15:

  

Die Notation für expliziten Aufruf eines destructor kann für jeden skalaren Typnamen verwendet werden. dies ermöglicht macht es möglich, Code zu schreiben, ohne wissen zu müssen, wenn ein destructor für einen bestimmten Typ existiert.

Der Unterschied eine einfache int und einen typedef int zwischen ist, dass sie syntaktisch verschiedene Dinge sind. Die Regel ist, dass in einem Destruktoraufrufs, die Sache nach dem ~ ist ein Typname. int ist nicht so etwas, aber ein typedef-Name ist. Schauen Sie es in 7.1.5.2 auf.

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