2013-06-21 6 views
7

Gibt es trotzdem den ursprünglichen Namen eines Typs von einem typedef-Namen für diesen Typ zu unterscheiden?Unterscheiden C++ 11 ursprünglichen Typ-Name von Typdef-Name?

Zum Beispiel:

class C1 {}; 

typedef C1 C2; 

C1 und C2 beide nun die gleiche Art nennen. Gibt es im Code nach dem oben genannten Fall immer einen Fall, in dem ein Vorkommen des Namens C1, der sich auf den fraglichen Typ bezieht, nicht durch C2 ersetzt werden kann (oder umgekehrt)?

Antwort

3

Sie sind komplett nicht unterscheidbar nach der typedef.

5

Ein typedef erzeugt einen Alias, und sie sind als Typ nicht unterscheidbar. Andererseits gibt es einige spezifische Syntaxkonstrukte, die den realen Typ und nicht den Typdef-ed (Deklaration/Definition von Konstruktor/Destruktoren ...) erfordern, aber das ist eine andere Frage. Als ein Typ sind sie nicht unterscheidbar.

+0

10 Ist Ihnen bekannt, ob das der einzige Fall ist (Konstruktoren/Destruktoren)? Was sind die anderen Syntax-Konstrukte abgesehen von Konstruktoren/Destruktoren? –

+0

@ user1131467 Siehe $ 7.1.3 für weitere Informationen zu 'typedef'. In Bezug auf Ihren Kommentar können $ 7.1.3/8 und $ 7.1.6.3 weitere Erläuterungen geben. –

+0

Sie möchten vielleicht den _injected class name_ nachlesen. Innerhalb von 'C1' gibt es spezielle Regeln zum Nachschlagen des Namens 'C1'. Aber da 'C2' die selbe Klasse benennt, ist das Nachschlagen' C1' in 'C2' auch etwas Besonderes. OTOH, "C2" wird nicht in "C1" injiziert. – MSalters

2

aus dem Complete Reference:

„C können Sie explizit auf neue Datentypnamen definieren, indem Sie das Stichwort typedef Sie sind nicht wirklich einen neuen Datentyp zu schaffen, sondern einen neuen Namen für eine Definition von bestehenden. Art."

Was (vielleicht) ist interessant C++ 1J wird implementieren, wird der Basisname nicht austauschbar stark typisierte typededef (undurchsichtigen typedef genannt) ist: PDF Report

+1

+1 Für die C++ 1Y-Notiz. :) –

0

Ja, es ist eine solche Fall. Sie können den Typ nicht mit typedef weiterleiten. Zum Beispiel wäre class C2; nicht gültig.

Darüber hinaus erstellt ein typedef einen Identitätstyp-Alias ​​und sollte vollständig äquivalent sein.

1

Ja. Aus Gründen der C-Kompatibilität können Sie class explizit zu C1 hinzufügen: class C1 foo;, aber class C2 foo; ist illegal.

Der Grund dafür ist, dass C separate Namespaces für Strukturen und Funktionen hatte, so dass Sie auch eine Funktion void C1(int) haben könnten. Dies führte zu keinen Mehrdeutigkeiten, da jedem Strukturnamen das Präfix struct vorangestellt werden musste. Aber wenn Sie struct C1 eingeben, dann war der Typname-Name nicht zulässig, um eine vorhandene Funktion umzubenennen.