Ein Destruktor Soll OR nicht mit einem Zeiger deklariert werden? in C ++

8

In C ++ 0x -n3290 Entwurf: sie wurden im Abschnitt hinzugefügt: Destruktoren: 12.4 / 2. Punkt letzte Zeile

%Vor%

In c ++ 03 Draft .... haben sie diesen Punkt in Destruktoren nicht erwähnt?

meine Frage ist, ob

%Vor%

Diese Art der Deklaration ist erlaubt? Nein, wo im Entwurf hat er darüber geschrieben ... Erklärung?

In GCC 4.6.0, Sun / Oracle C ++ 12.0, --- ist diese Deklaration erlaubt int Comeau C / C ++ - & gt; nicht erlaubt

    
user751747 07.09.2011, 06:16
quelle

3 Antworten

7

Sie haben missverstanden, was ref-qualifier im neuen Standard bedeutet. Auf die gleiche Weise, wie Sie einer Memberfunktion in C ++ 03 das Qualifikationsmerkmal const zuweisen können, können Sie auch einer Memberfunktion in C ++ 0x ein ref-qualifier hinzufügen. Dieser Modifizierer wirkt sich auf den Typ des impliziten this -Arguments für die Funktion aus:

%Vor%

Genauso wie ein Destruktor in C ++ 03 nicht static oder const oder const volatile sein kann, kann kein Qualifikationsmerkmal ( & oder && ) in C ++ 0x. Natürlich war dieses Bit im alten Standard nicht vorhanden.

    
David Rodríguez - dribeas 07.09.2011, 07:57
quelle
10

Das sieht nicht so aus, als wäre es jemals eine rechtliche Funktionsdeklaration, geschweige denn für einen Destruktor. Ich bin nicht sicher, worüber dieser Teil des Standards spricht, aber ich kann es nur raten.

Ich vermute, dass es ein Qualifikationsmerkmal gibt, das besagt, dass Ihre Funktion auf einer R-Referenz aufgerufen wird. Etwas wie das:

%Vor%

Ich denke, die Sprache im Standard sagt, dass dieses Qualifikationsmerkmal für einen Destruktor nicht erlaubt ist, ähnlich wie wenn ein nachkommendes const ebenfalls illegal wäre.

Und bei weiterer Untersuchung steigt meine Gewissheit über die Richtigkeit meiner Vermutung beträchtlich. Hier ist die Begründung:

Dort heißt es eindeutig, dass Funktionen nach dem 'cv-qualifer' nun einen 'Ref-Qualifier' haben können. Dies bedeutet, dass eine Funktionsdeklaration nun von const & oder const volatile && statt nur von const folgen kann. Und der verwendete Begriff (Ref-Qualifier) ​​ist derselbe wie der Begriff, der in dem kleinen Teil des Standards verwendet wird, den du zitierst. Und es macht Sinn, dass Destruktoren keinen haben können.

    
Omnifarious 07.09.2011 06:24
quelle
1

Die Regel, nach der Sie suchen, wird im selben Absatz 12.4p2

angegeben
  

Ein Destruktor nimmt keine Parameter und es kann kein Rückgabetyp angegeben werden (nicht einmal void).

Der Ausdruck "kein Rückgabetyp kann dafür angegeben werden" verbietet auch "*", was nicht sofort klar ist, aber durch Vergleich mit 12.3.2p1 gesehen werden kann (vergleiche mit dieser Problembericht ):

  

... Solche Funktionen werden Konvertierungsfunktionen genannt. Es kann kein Rückgabetyp angegeben werden.

Diese Regel macht Implementierungen verbieten * operator int() { } . Sie können auch mit 12.4p1 argumentieren, obwohl das, wie gesagt, sehr allgemein gehalten ist und die erste Anweisung im Destruktor-Abschnitt ist, denke ich, dass die andere obige Aussage das Hauptargument sein sollte

  

Um den Destruktor in einer Klassendefinition zu deklarieren, wird eine spezielle Deklaratorsyntax verwendet, die einen optionalen Funktionsspezifizierer (7.1.2), gefolgt von dem Klassennamen des Destruktors gefolgt von einer leeren Parameterliste verwendet.

Wie man sehen / lesen kann, werden Deklaratoren wie * in dieser Beschreibung nicht erwähnt, was die Absicht der Autoren zeigt.

    
Johannes Schaub - litb 07.09.2011 18:14
quelle

Tags und Links