Was ist, wenn ein Konstruktorparameter den gleichen Namen wie eine Membervariable in C ++ hat?

7

Einige Code zuerst:

%Vor%

Ja, in COuter::COuter( const CInner& ) hat der Parameter denselben Namen wie die Elementvariable.

In VC ++, das funktioniert - VC ++ bekommt die Idee, dass es nur sinnvoll ist, die Membervariable mit dem Parameter zu initialisieren und das passiert - CInner::inner wird mit dem Parameter initialisiert. Aber wenn dasselbe mit GCC kompiliert wird, wird es auf eine andere Art und Weise interpretiert: GCC initialisiert CInner::inner mit sich selbst und bleibt daher nicht initialisiert.

Welcher der Compiler ist richtig?

    
sharptooth 09.02.2010, 06:33
quelle

2 Antworten

25

Es geht nicht wirklich darum, dass ein bestimmter Compiler entscheidet, was vernünftig ist und was nicht. Die Sprachspezifikation besagt explizit, dass in inner(inner) , das in der Initialisiererliste des Konstruktors verwendet wird, das erste inner im Klassenbereich nachgeschlagen werden soll (dh auf COuter::inner auflösen), während das zweite inner im Konstruktor nachgeschlagen werden sollte scope (dh auf den Konstruktorparameter inner auflösen).

Das haben Sie als VC ++ - Verhalten beschrieben. Es fällt mir jedoch schwer zu glauben, dass sich GCC in diesem Fall falsch verhalten würde (es sei denn, Sie haben eine seltsame alte Version von GCC). Sind Sie sicher, dass Sie das Verhalten von GCC nicht falsch interpretiert haben?

    
AnT 09.02.2010 06:41
quelle
12

Visual C ++ ist korrekt. Ich vermute, dass Sie eine ältere Version von gcc für Ihren Test verwenden - zumindest soweit ich mich erinnere, machen die letzten das richtig. Dies wird in §12.6.2 / 7 der Norm behandelt, die folgendes Beispiel gibt:

%Vor%
  

initialisiert X :: r, um auf X :: a zu verweisen, initialisiert X :: b mit dem Wert des Konstruktors   Parameter i, initialisiert X :: i mit dem Wert des Konstruktorparameters i, [...]

    
Jerry Coffin 09.02.2010 06:44
quelle

Tags und Links