Quelle est la logique derrière le “à l'aide de” mot-clé en C++?
Quelle est la logique derrière le "à l'aide de" mot-clé en C++?
Il est utilisé dans différentes situations et je suis en train d'essayer de trouver
si tous ceux qui ont quelque chose en commun et il y a une raison
pourquoi "l'utilisation de" mot-clé est utilisé en tant que 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
- Norme comité déteste l'introduction de nouveaux mots-clés en C++ de la grammaire.
- Si c'est la logique vraiment, veuillez m'excuser, je vais aller me tuer maintenant.
- Je ne sais pas si c'est la logique, mais je parie que c'est au moins une des raisons de ce choix. Oh, et pas besoin de vous faire du mal !
- Vous faire reconnaître les implications de l'introduction de nouveaux mots réservés, droit? Cela signifie que tous les code utilisé comme identificateur de noms soudain, ne peut pas compiler. C'est une MAUVAISE CHOSE. Par exemple, il y a beaucoup de code C qui ne peut pas compiler en C++, car il contient des choses comme
int class;
. Ce serait encore pire si le code C++ soudainement cessé d'être valide en C++. - Si c'est le cas, alors je vois pas la logique.
- Le fait que le code C à l'aide de
int class;
ne sera pas compilé comme le C++ n'est pas entièrement une mauvaise chose. Il peut être utilisé pour garantir que le code C est compilé comme C. Il est trop facile d'oublier que le C et le C++ sont deux langages différents-et, pratiquement parlant, il y a un code valide C et valide en C++ , mais avec des sémantiques différentes. - À cet égard,
using
n'est pas pire (ou mieux) questatic
. À mon humble avis, au point de ne pas introduire de nouveaux mots-clés est très important, comme expliqué par teh internets est faite de catz et Ben Voigt.
Vous devez vous connecter pour publier un commentaire.
En C++11, le
using
mot-clé lorsqu'il est utilisé pourtype alias
est identique àtypedef
.7.1.3.2
Bjarne Stroustrup fournit un exemple pratique:
Pré-C++11, le
using
mot-clé peut apporter des fonctions de membre en application. En C++11, vous pouvez maintenant le faire pour les constructeurs (un autre Bjarne Stroustrup exemple):Ben Voight fournit une assez bonne raison derrière la raison d'être de ne pas introduire un nouveau mot ou une nouvelle syntaxe. La norme veut éviter la rupture de l'ancien code autant que possible. C'est pourquoi, dans les documents de proposition, vous verrez des sections comme
Impact on the Standard
,Design decisions
, et comment ils pourraient affecter vieux code. Il existe des situations où une proposition semble être une très bonne idée, mais peut ne pas avoir de traction, car il serait trop difficile à mettre en œuvre, trop confus, ou irait à l'encontre de l'ancien code.Ici est un vieux papier à partir de 2003 n1449. Le raisonnement semble être liée à des modèles. Avertissement: il peut y avoir des fautes de frappe dues à la copie de fichier PDF.
Le document de suivi n1489 explique pourquoi
using
au lieu d'utilisertypedef
:Je pense que la distinction importante est faite ici, aliases au lieu de types. 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), des fonctions de membre du, hériter constructeursIl pas est utilisée pour:
Au lieu de faire:
De nommer un ensemble de surcharges.
using P = [](double)->void;
est, autant que je sache, non valide en C++11. Ceci, toutefois, est:using P = auto(double)->void;
et produit un type de fonction (tels queP*
est un pointeur de fonction).register
n'est pas mauvais, est dans:register X as Y
register
commence une déclaration de variable, donc cela a déjà un sens. Déclarer un registre appelé variable Y de type X.