7
votes

Distinguing C ++ 11 Nom de type original de TypeDEF-Nom?

existe-t-il de toute façon pour distinguer le nom d'origine d'un type d'un nom TypeDEF pour ce type?

Par exemple: P>

class C1 {};

typedef C1 C2;


0 commentaires

5 Réponses :


3
votes

Ils sont complètement indiscernables après le Typedef .


0 commentaires

5
votes

Un typedef crée un alias et ils sont indiscernables comme un type. Il y a d'autre part certaines constructions de syntaxes spécifiques nécessitant le type réel et non le typeDEF-DE (déclaration / définition du constructeur / destructeurs ...), mais c'est une question différente. Comme un type, ils sont indiscernables.


4 commentaires

Savez-vous si c'est le seul cas (constructeurs / destructeurs)? C'est-à-dire quelles sont les autres constructions de la syntaxe des constructeurs / destructeurs?


@ user1131467 Voir 7,1,3 $ Pour plus d'informations sur Typedef . En ce qui concerne votre commentaire 7,1,3 / 8 $ et 7.1.6.3 $ peut donner une clarification supplémentaire.


Vous voudrez peut-être lire sur le nom de la classe injecté . Intérieur C1 Il existe des rulstions spéciales pour rechercher le nom C1 . Mais depuis C2 Noms de la même classe, rechercher C1 dans C2 est également spécial. OTOH, C2 n'est pas injecté dans C1 .


De plus, vous ne pouvez pas transmettre déclarer un nom de classe Typedeffed.



2
votes

du Référence complète :

"C vous permet de définir explicitement les nouveaux noms de type de données à l'aide du mot-clé TPYDEF. Vous ne créez pas de nouveau type de données, mais définissez plutôt un nouveau nom pour un type existant."

Qu'est-ce qui est intéressant, c'est (peut-être) C ++ 1y implémentera un TypeDef typé fort (appelé opaque typedef ) qui n'est pas interchangeable le nom de base: rapport pdf


0 commentaires

0
votes

Oui, il y a un tel cas. Vous ne pouvez pas transmettre le type en utilisant le type de caractères. Par exemple, classe C2; ​​ ne serait pas valide.

autre que cela, un typef crée un alias de type d'identité et devrait être complètement équivalent.


0 commentaires

1
votes

oui. Pour des raisons de compatibilité C, vous êtes autorisé à ajouter explicitement classe à c1: classe C1 foo; , mais classe C2 foo; est illégal .

La raison en est que c avait des espaces de noms séparés pour les structs et les fonctions, vous pouvez également avoir une fonction vide c1 (int) . Cela n'a provoqué aucune ambiguïté car chaque nom de structure devait être préfixé avec struct . Mais si vous tapez struct C1 , le nom TypeDEF n'a pas été autorisé à alias une fonction existante.


0 commentaires