Ich habe mich kürzlich gefragt, warum das Schlüsselwort auto
in C ++ 11 gewählt wurde, um eine Variable zu markieren, deren Typ vom Compiler abgeleitet werden muss, wie in
auto x = 1;
Schon seit
var
scheint häufiger in anderen Programmiersprachen (z. B. C #, Scala, JavaScript) und- Soweit ich die neue Semantik verstehen
auto
bricht Abwärtskompatibilität (es selten benutzt wurde , aber eine andere Bedeutung in früheren Versionen von C ++ hatte, siehe zB hier )
Ich wollte fragen, ob es einen besonderen Grund für die Wahl gibt auto
(zugunsten eines var
oder eines anderen Schlüsselworts). Gab es eine spezielle Diskussion zu diesem Problem, bevor der C ++ 11-Standard veröffentlicht wurde?
Gibt es auch mögliche Inkompatibilitäten, auf die wir achten sollten, wenn wir älteren C ++ - Code mit einem C ++ 11-Compiler neu kompilieren?
c++
c++11
type-systems
Giorgio
quelle
quelle
auto
könnte die Abwärtskompatibilität beeinträchtigen, aber je nachdem, wie oftvar
ein Variablenname verwendet wird, verglichen mit derauto
Häufigkeit, mit der das Schlüsselwort in Code vor 11 verwendet wird, hat das Komitee möglicherweise die Ansicht vertreten, dass die Kompatibilität weniger dramatisch beeinträchtigt wird als die Einführung eines neuen Stichwort würde.auto
vs-var
Frage ist, worauf sich 90% Ihres Textes bezieht, und diese Frage hat kein endgültiges Ergebnis. (obwohl ich nicht derjenige bin, der abgestimmt hat, um zu schließen)auto
wurde für C ++ vorgeschlagen, bevorvar
es in C # eingeführt wurde. Daher sollte die Frage lauten, warum C # nicht auto verwendet. var hat eine andere Bedeutung in JavaScript und ScalaAntworten:
Fast jedes Wort, das Sie einer Sprache als Schlüsselwort hinzufügen möchten, wurde mit ziemlicher Sicherheit als Variablenname oder als anderer Teil des Arbeitscodes verwendet. Dieser Code würde beschädigt, wenn Sie dieses Wort zu einem Schlüsselwort machen würden.
Das unglaublich Glückliche daran
auto
ist, dass es sich bereits um ein Schlüsselwort handelte. Die Leute hatten also keine Variablen mit diesem Namen, aber niemand hat es verwendet, weil es die Standardeinstellung war. Warum tippen:wann
genau dasselbe gemeint?
Ich nehme an, irgendwo auf dem Planeten gab es eine kleine Menge Code, der auf die alte Weise "auto" verwendete. Aber es könnte behoben werden, indem das 'Auto' entfernt wird und es würde wieder funktionieren. Daher lag es auf der Hand, das Keyword erneut zu verwenden.
Ich denke auch, dass es eine klarere Bedeutung hat. Wenn Sie mit Varianten und dergleichen gearbeitet haben,
var
denken Sie möglicherweise, dass die Deklaration weniger stark getippt ist, als wenn Sie alle Tasten auf der Tastatur selbst gedrückt haben, um den Variablentyp anzugeben. Für michauto
wird klarer, dass Sie den Compiler auffordern, den Typ automatisch abzuleiten. Dieser Typ ist genauso stark, als hätten Sie ihn selbst angegeben. Es war also wirklich eine sehr glückliche Pause, die dem Komitee einen guten Namen gegeben hat.Um den (kleinen) Bruch zu klären:
Wenn du hättest
Wenn Sie versucht haben, mit einem C ++ 11-Compiler zu kompilieren, erhalten Sie jetzt eine Fehlermeldung wie
Dies ist trivial, Sie entfernen nur entweder das Auto oder das Int und kompilieren neu.
Es gibt jedoch ein größeres Problem. Wenn du hättest
C und das wirklich alte C ++ würden
i
einint
(wie es wäre, wenn Sie aufhören würdenauto
- Standarddeklaration warint
). Wenn Sie lange nicht mit dem Kompilieren dieses Codes gearbeitet haben oder alte Compiler verwendet haben, können Sie zumindest theoretisch einen Teil dieses Codes haben. C ++ 11 würde es zu einem machen,double
da 4.3 genau das ist. (Oder vielleicht afloat
, ich bin immer noch im Boxing Day-Modus, aber der springende Punkt ist, keinint
.) Dies könnte subtile Fehler in Ihrer gesamten App hervorrufen. Und ohne irgendwelche Warnungen oder Fehler vom Compiler. Die Leute in diesem Boot sollten global suchenauto
, um sicherzustellen, dass sie es nicht auf die alte Art und Weise verwendeten, bevor sie zu einem C ++ 11-Compiler wechseln. Glücklicherweise ist ein solcher Code äußerst selten.quelle
auto
wenn ihm ein Typname folgt?error C3530: 'auto' cannot be combined with any other type-specifier
zu dieser Zeileauto i = 4.3;
, weil das in C ++ 03 / C ++ 98 schlecht geformt war. C ++ hat nicht tragen über die ‚impliziten int‘ Regel , dass C89 hatte (und in der C99 Revision fallen gelassen).