Welche Logik steckt hinter dem Schlüsselwort "using" in C ++?
Es wird in verschiedenen Situationen verwendet und ich versuche herauszufinden, ob all diese etwas gemeinsam haben, und es gibt einen Grund, warum das Schlüsselwort "using" als solches verwendet wird.
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;
. Es wäre noch schlimmer, wenn C ++ - Code plötzlich nicht mehr gültiges C ++ wäre.int class;
nicht als C ++ kompiliert wird, ist keine ganz schlechte Sache. Es kann verwendet werden, um zu gewährleisten, dass C-Code als C kompiliert wird. Es ist zu leicht zu vergessen, dass C und C ++ zwei verschiedene Sprachen sind - und praktisch gibt es Code, der C und C ++ gültig ist, aber unterschiedliche Semantik aufweist.using
ist nicht schlechter (oder besser) alsstatic
. Meiner Meinung nach ist es sehr wichtig, keine neuen Schlüsselwörter einzuführen, da das Internet aus Catz und Ben Voigt besteht.Antworten:
In C ++ 11 ist das
using
Schlüsselwort bei Verwendung fürtype alias
identisch mittypedef
.7.1.3.2
Bjarne Stroustrup bietet ein praktisches Beispiel:
Vor C ++ 11 kann das
using
Schlüsselwort Mitgliedsfunktionen in den Geltungsbereich bringen. In C ++ 11 können Sie dies jetzt für Konstruktoren tun (ein weiteres Beispiel von Bjarne Stroustrup):Ben Voight liefert einen ziemlich guten Grund für die Begründung, kein neues Schlüsselwort oder keine neue Syntax einzuführen. Der Standard möchte vermeiden, dass alter Code so weit wie möglich beschädigt wird. Aus diesem Grunde ist in den Vorschlägen werden Sie Abschnitte sehen mögen
Impact on the Standard
,Design decisions
und wie sie könnten älteren Code beeinflussen. Es gibt Situationen, in denen ein Vorschlag eine wirklich gute Idee zu sein scheint, aber möglicherweise keine Wirkung hat, weil er zu schwierig zu implementieren, zu verwirrend oder dem alten Code zuwiderlaufen würde.Hier ist ein altes Papier aus dem Jahr 2003 n1449 . Die Begründung scheint mit Vorlagen zu zusammenhängen. Warnung: Beim Kopieren aus PDF können Tippfehler auftreten.
Das Folgepapier n1489 erklärt, warum
using
anstelle vontypedef
:Ich denke, hier wird die wichtige Unterscheidung getroffen, alias es statt type s. Ein weiteres Zitat aus demselben Dokument:
Zusammenfassung für die Rolle von
using
:namespace PO = boost::program_options
undusing PO = ...
gleichwertig)A typedef declaration can be viewed as a special case of non-template alias-declaration
. Es ist eine ästhetische Veränderung und wird in diesem Fall als identisch angesehen.namespace std
in den globalen Geltungsbereich), Elementfunktionen, Konstruktoren erbenEs kann nicht verwendet werden für:
Tun Sie stattdessen:
Benennen einer Reihe von Überladungen.
quelle
using P = [](double)->void;
ist, AFAIK, nicht gültig C ++ 11. Dies ist jedoch:using P = auto(double)->void;
und erzeugt einen Funktionstyp (so dassP*
es sich um einen Funktionszeiger handelt).register
würde nicht so schlecht klingen, ist in:register X as Y
register
beginnt eine Variablendeklaration, so dass dies bereits eine Bedeutung hat. Deklarieren Sie eine Registervariable namens Y vom Typ X.