C
Referent schrieb:
Danke für die Antwort! Wenn ich das richtig verstehe, dann liege ich mit meinen Annahmen immer richtig? (Wenn man davon absieht, dass ich das mangels Fachkenntnis alles deutlich vereinfacht dargestellt habe).
Und was sagt ill-formed genau aus?
Ein Fehler, der vom Compiler als solcher erkannt und angezeigt werden muss (einschließlich Syntaxfehlern) oder ein Verstoß gegen die ODR. Im Gegensatz zu Verstößen, die der Compiler erkennen darf aber nicht muss und solchen Konstrukten, die bloß (möglicherweise nur bei bestimmtem Input) undefiniertes Verhalten haben.
Referent schrieb:
Was mir jetzt zu foo() noch auffällt: Das könnte ja genau so gut eine Funktion sein. Mein Compiler hängt sich auch auf, wenn es neben der Klasse foo noch eine Funktion foo gibt. Gibt es eine Möglichkeit, das eindeutig auszudrücken? Für den default-ctor bei benannten Objekten lässt man dazu ja einfach die Klammern weg.
Im gleichen Namensraum können entweder eine Klasse oder eine Aufzählung und entweder ein Objekt, eine (möglicherweise überladene) Funktion oder eine Aufzählungskonstante gleichen Namens existieren. In diesem Falle wird die Klasse bzw. der Aufzählungstyp verdeckt. Dieses Feature existiert nur zwecks C-Kompatibilität, denn dort haben Tagnamen ihren eigenen Namensraum. Ansonsten sollte man diese Möglichkeit nicht nutzen. In einer solchen Situation kann man wie in C auf die Klasse bzw. die Aufzählung zugreifen, indem man enum,struct,class,union davorschreibt. Unabhängig davon wären obige Beispiele, wenn foo eine Funktion wäre, alle ill-formed. Dann ist schon die Referenzdeklaration fehlerhaft, da foo kein Typ wäre. Sollte foo dagegen ein Funktionstyp sein, wäre der Ausdruck foo() ill-formed, Beispiel 2 allerdings möglich - natürlich müsste dann tmp noch irgendwo definiert werden, denn
foo tmp;
ist dann nur eine Funktionsdeklaration.