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?
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?
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, [...]
Tags und Links c++ gcc visual-c++ initialization