Was ist die Logik hinter dem Schlüsselwort "using" in C++?
Was ist die Logik hinter dem Schlüsselwort "using" in C++?
Es ist verwendet in verschiedenen Situationen und ich bin auf der Suche
wenn alle diese haben etwas gemeinsames, und es gibt einen Grund,
warum das Schlüsselwort "using" ist als solche verwendet.
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
Standard Committee hasst die Einführung neuer Schlüsselwörter in C++ Grammatik.
Wenn das die Logik ist, die wirklich, bitte entschuldigen Sie mich, ich werde gehen und töten mich jetzt.
Sie erkennen die Auswirkungen der Einführung neuer reservierte Wörter, richtig? Es bedeutet, dass alle bestehenden code, der verwendet, diejenigen, die als Bezeichner-Namen plötzlich nicht kompiliert werden kann. Das ist eine SCHLECHTE SACHE. Zum Beispiel, es gibt eine Menge C-code, der nicht kompiliert, wie C++, denn es enthält Dinge wie
Die Tatsache, dass C-code mithilfe
In dieser Hinsicht
Wenn das die Logik ist, die wirklich, bitte entschuldigen Sie mich, ich werde gehen und töten mich jetzt.
Sie erkennen die Auswirkungen der Einführung neuer reservierte Wörter, richtig? Es bedeutet, dass alle bestehenden code, der verwendet, diejenigen, die als Bezeichner-Namen plötzlich nicht kompiliert werden kann. Das ist eine SCHLECHTE SACHE. Zum Beispiel, es gibt eine Menge C-code, der nicht kompiliert, wie C++, denn es enthält Dinge wie
int class;
. Es wäre noch schlimmer, wenn C++ - code plötzlich nicht mehr gültig ist C++.Die Tatsache, dass C-code mithilfe
int class;
wird nicht kompiliert, wie C++ ist nicht immer eine schlechte Sache. Es kann verwendet werden, um zu garantieren, dass C-code kompiliert werden, wie C. Es ist zu einfach, zu vergessen, dass C und C++ sind zwei verschiedene Sprachen-und, praktisch gesprochen, es ist der code, das ist gültiges C und gültige C++ , aber mit unterschiedlicher Semantik.In dieser Hinsicht
using
ist nicht schlechter (oder besser) als static
. IMHO der Punkt, der nicht die Einführung von neuen keywords ist sehr wichtig, wie bereits erläutert, durch die teh internets ist aus catz und Ben Voigt.InformationsquelleAutor user3111311 | 2013-12-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
In C++11, die
using
Schlüsselwort, wenn Sie für dietype alias
ist identisch mittypedef
.7.1.3.2
Bjarne Stroustrup bietet ein Beispiel aus der Praxis:
Pre-C++11, die
using
keyword bringen können member-Funktionen in scope. In C++11, können Sie jetzt tun Sie dies für Konstruktoren (andere Bjarne Stroustrup B.):Ben Voight bietet einen ziemlich guten Grund, hinter die Logik der nicht die Einführung einer neuen keyword oder eine neue syntax. Der standard will, um zu vermeiden, brechen alte code so viel wie möglich. Dies ist der Grund, warum im Vorschlag der Dokumente sehen Sie Abschnitte wie
Impact on the Standard
,Design decisions
, und wie Sie sich auswirken könnten, älteren code. Es gibt Situationen, wenn ein Vorschlag scheint wie eine wirklich gute Idee, aber möglicherweise nicht die Traktion, denn es wäre zu schwierig zu implementieren, zu verwirrend oder widersprechen würde alte code.Hier ist ein altes Papier aus dem Jahr 2003 n1449. Die Begründung scheint zu sein, in Bezug auf Vorlagen. Warnung: es kann sein, Schreibfehler durch kopieren aus der PDF.
Den follow-up-Papier n1489 erklärt, warum
using
anstatttypedef
:Ich denke, der entscheidende Unterschied ist hier aliases statt Typs. Ein weiteres Zitat aus demselben Dokument:
Zusammenfassung, für die Rolle des
using
:namespace PO = boost::program_options
undusing PO = ...
äquivalent)A typedef declaration can be viewed as a special case of non-template alias-declaration
. Es ist eine ästhetische Veränderung und wird als identisch, in diesem Fall.namespace std
in das Globale scope), member-Funktionen, Konstruktoren ErbenEs nicht verwendet werden für:
Stattdessen tun:
Benennen eine Reihe von überladungen.
using P = [](double)->void;
ist, AFAIK, nicht gültig C++11. Dieser ist jedoch:using P = auto(double)->void;
und erzeugt eine Funktion geben (so, dassP*
ist ein Funktionszeiger).Sein name ist Bjarne Stroustrup 😉 (Hinweis: das zweite r in Stroustrup)
eigentlich
register
nicht so klingen würde, dass schlechte, in:register X as Y
Leider
register
beginnt eine Variablen-Deklaration, so dass das schon einen Sinn hat. Deklarieren Sie eine register-variable namens Y vom Typ X.InformationsquelleAutor