Quelle est la logique derrière le mot clé «using» en C ++?
Il est utilisé dans différentes situations et j'essaie de trouver si tous ceux-ci ont quelque chose en commun et il y a une raison pour laquelle le mot-clé "using" est utilisé comme tel.
using namespace std; // to import namespace in the current namespace
using T = int; // type alias
using SuperClass::X; // using super class methods in derived class
int class;
. Ce serait encore pire si le code C ++ cessait soudainement d'être valide en C ++.int class;
ne soit pas compilé en C ++ n'est pas entièrement une mauvaise chose. Il peut être utilisé pour garantir que le code C sera compilé en C. Il est trop facile d'oublier que C et C ++ sont deux langages différents - et, en pratique, il existe du code qui est C valide et C ++ valide, mais avec une sémantique différente.using
n'est pas pire (ou meilleur) questatic
. À mon humble avis, le fait de ne pas introduire de nouveaux mots-clés est très important, comme expliqué par les internets sont constitués de catz et Ben Voigt.Réponses:
Dans C ++ 11, le
using
mot clé utilisé pourtype alias
est identique àtypedef
.7.1.3.2
Bjarne Stroustrup fournit un exemple pratique:
Pré-C ++ 11, le
using
mot - clé peut amener les fonctions membres dans la portée. En C ++ 11, vous pouvez maintenant le faire pour les constructeurs (un autre exemple de Bjarne Stroustrup):Ben Voight fournit une assez bonne raison derrière la justification de ne pas introduire un nouveau mot-clé ou une nouvelle syntaxe. La norme veut éviter autant que possible de casser l'ancien code. Voilà pourquoi dans les documents de proposition , vous verrez des sections comme
Impact on the Standard
,Design decisions
et comment ils pourraient affecter l' ancien code. Il y a des situations où une proposition semble être une très bonne idée mais pourrait ne pas avoir de traction parce qu'elle serait trop difficile à mettre en œuvre, trop déroutante ou contredirait l'ancien code.Voici un vieux papier de 2003 n1449 . La justification semble être liée aux modèles. Attention: il peut y avoir des fautes de frappe en raison de la copie depuis un PDF.
Le document de suivi n1489 explique pourquoi
using
au lieu d'utilisertypedef
:Je pense que la distinction importante est faite ici, alias es au lieu de type s. Une autre citation du même document:
Résumé, pour le rôle de
using
:namespace PO = boost::program_options
etusing PO = ...
équivalent)A typedef declaration can be viewed as a special case of non-template alias-declaration
. C'est un changement esthétique, et est considéré comme identique dans ce cas.namespace std
dans la portée globale), fonctions membres, hériter des constructeursIl ne peut pas être utilisé pour:
Faites plutôt:
Nommer un ensemble de surcharges.
la source
using P = [](double)->void;
est, AFAIK, non valide C ++ 11. Ceci est cependant:using P = auto(double)->void;
et produit un type de fonction (tel qu'unP*
pointeur de fonction).register
ne sonnerait pas si mal, est dans:register X as Y
register
commence une déclaration de variable donc cela a déjà une signification. Déclarez une variable de registre appelée Y de type X.