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 *this
hinsichtlich 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 X
in einem Kontext verwendet, in dem es this
verwendet 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 *this
mü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.