Typ von "dies" in der statischen Elementfunktion?

75

In C ++ 5.1.1 / 3 [expr.prim.general] heißt es:

Der Typ und die Wertekategorie [von this] werden innerhalb einer statischen Elementfunktion definiert.

Was bedeutet das? Wie ist es relevant?

Beachten Sie, dass:

this darf nicht in der Deklaration einer statischen Elementfunktion erscheinen

Andrew Tomazos
quelle
31
Jemand, ruf Bjarne an!
Alexander Shukaev
Der von Ihnen zitierte Text befindet sich nicht in N3242. Ist der endgültige Standard irgendwo öffentlich verfügbar?
zwol
Es ist von N3485 (Nov 2012)
Andrew Tomazos
3
@Zack: Ja, aber du musst dafür bezahlen. Die billigste Quelle ist wahrscheinlich hier . Der Entwurf, der dem veröffentlichten Standard am nächsten kommt, ist n3337
Mike Seymour
Haben Sie eine vernünftige Erklärung für die angedeutete "Überrestsprache" erhalten, die @ecatmur in seiner Antwort unten erwähnt hat? Ich habe Ihre Diskussion mit Jens Maurer hier gesehen , aber AFAICT Ihre Frage wurde noch nicht beantwortet.
Belloc

Antworten:

78

Die Sprache in der Norm kann auf n3282 zurückgeführt werden , was eine Lösung für die Fehler 1207 und 1017 darstellt . Insbesondere erscheint die Sprache in der vorgeschlagenen Lösung für den Mangel 1207 und sollte daher im Kontext der Norm betrachtet werden, wie sie zum Zeitpunkt der Behebung des Mangels bestand. Zu dieser Zeit gab es einige Bedenken *thishinsichtlich des Umschreibens von ID-Ausdrücken in Mitgliedszugriffsausdrücke unter Verwendung von (9.3.1p3), insbesondere im Zusammenhang mit Deklarationen vom Typ Trailing-Return (siehe Ausgabe 945 ).

Wenn wir die vorgeschlagene Lösung für den Fehler 1207 mit der letztendlichen Sprache in n3282 und anschließend im Standard vergleichen, gibt es einen signifikanten Unterschied zu 9.3.1p3:

Fehler 1207:

Wenn ein ID-Ausdruck (5.1 [expr.prim]), der nicht Teil einer Zugriffssyntax für Klassenmitglieder (5.2.5 [expr.ref]) ist und nicht zur Bildung eines Zeigers auf member (5.3.1 [expr.unary) verwendet wird .op]) wird in der Deklaration einer Mitgliedsfunktion der Klasse verwendetX , wenn die Namenssuche (3.4 [basic.lookup]) den Namen auflöst ...

n3282 und C ++ 11:

Wenn ein ID-Ausdruck (5.1 [expr.prim]), der nicht Teil einer Zugriffssyntax für Klassenmitglieder (5.2.5 [expr.ref]) ist und nicht zur Bildung eines Zeigers auf member (5.3.1 [expr.unary) verwendet wird .op]) wird in einem Klassenmitglied Xin einem Kontext verwendet, in dem es thisverwendet werden kann (5.1.1 [expr.prim.general]) , wenn die Namenssuche (3.4 [basic.lookup]) den Namen [...] auflöst.

Es ist offensichtlich, dass die vorgeschlagene Lösung zum Defekt 1207 die Überzeugung enthielt, dass ID-Ausdrücke (für ein statisches Element) innerhalb einer statischen Elementfunktion in Elementzugriffsausdrücke umgewandelt werden *thismüssten und daher Zugriff auf die Typ- und Wertkategorie von benötigen würden this. Zum Zeitpunkt der Erstellung von n3282 war dies zugunsten der Transformation der qualifizierten ID (ebenfalls 9.3.1p3) behoben worden, die nicht erforderlich ist this, aber die Sprache in 5.1.1p3 blieb unverändert.

Ich würde empfehlen, dieses Problem in der Newsgroup zur Diskussion über C ++ - Standards anzusprechen. Möglicherweise kann die Sprache der Überreste redaktionell entfernt werden.

ecatmur
quelle
Ok krank Mail isocpp / diskutieren.
Andrew Tomazos
Ich würde dir ein tolles Antwortabzeichen geben, wenn ich könnte.
Luchian Grigore
@ LuchianGrigore: Das musst du nicht. ;)
Uhr
1
Ok, ich habe einen Crosspost zu Isocpp / Diskussion hier
Andrew Tomazos