Ostatnio zastanawiałem się, dlaczego słowo kluczowe auto
zostało wybrane w C ++ 11 do oznaczenia zmiennej, której typ musi zostać wyprowadzony przez kompilator, jak w
auto x = 1;
Od
var
wydaje się bardziej powszechny w innych językach programowania (np. C #, Scala, JavaScript) i- O ile rozumiem nową semantykę
auto
zgodności wstecznej przerw (była rzadko używana, ale miała inne znaczenie w poprzednich wersjach C ++, patrz np. Tutaj )
Chciałem zapytać, czy istnieje jakiś szczególny powód wyboru auto
(na korzyść var
lub innego słowa kluczowego). Czy była jakaś konkretna dyskusja na ten temat przed wydaniem standardu C ++ 11?
Czy są też jakieś ewentualne niezgodności, na które powinniśmy uważać przy ponownej kompilacji starszego kodu C ++ za pomocą kompilatora C ++ 11?
c++
c++11
type-systems
Giorgio
źródło
źródło
auto
może zepsuć wsteczną kompatybilność, ale w zależności od tego, jak częstovar
jest używana jako nazwa zmiennej w porównaniu do tego, jak częstoauto
słowo kluczowe jest używane w kodzie wcześniejszym niż 11, komitet mógł uznać, że łamie on zgodność mniej dramatycznie niż wprowadzając nowy słowo kluczowe by.auto
Vsvar
pytanie jest co 90% odnosi się do tekstu, a to pytanie nie ma ostatecznego rezultatu. (chociaż nie jestem tym, który głosował za zamknięciem)auto
zostało zaproponowane wcześniej dla C ++var
w C #, więc pytanie powinno brzmieć dlaczego C # nie używa auto. var ma inne znaczenie w JavaScript i ScalaOdpowiedzi:
Prawie każde słowo, które możesz pomyśleć o dodaniu słowa kluczowego do języka, prawie na pewno zostało użyte jako nazwa zmiennej lub inna część działającego kodu. Ten kod zostałby zepsuty, jeśli uczynisz to słowo słowem kluczowym.
Niesamowicie szczęśliwą rzeczą
auto
jest to, że było to już słowo kluczowe, więc ludzie nie mieli zmiennych o tej nazwie, ale nikt go nie używał, ponieważ był domyślny. Dlaczego warto wpisać:kiedy
znaczyło dokładnie to samo?
Podejrzewam, że gdzieś na tej planecie była niewielka ilość kodu, który używał „auto” po staremu. Ale można to naprawić, usuwając „auto” i będzie działać ponownie. Dlatego zmiana przeznaczenia słowa kluczowego była oczywista.
Zdarza mi się również myśleć, że to jest jaśniejsze znaczenie. Jeśli pracowałeś z wariantami i takimi, możesz zobaczyć
var
, że deklaracja jest w jakiś sposób mniej silnie wpisana niż gdybyś sam nacisnął wszystkie klawisze na klawiaturze, aby określić typ zmiennej. Dla mnieauto
to wyjaśnia, że prosisz kompilator, aby automatycznie wydedukował typ, który jest tak silny, jakbyś sam go określił. Tak naprawdę to była bardzo szczęśliwa przerwa, dzięki której komitet zyskał dobre imię.Aby wyjaśnić (małe) zerwanie:
Gdybyś miał
i próbowałeś skompilować z kompilatorem C ++ 11, teraz pojawi się błąd taki jak
Jest to trywialne, wystarczy usunąć auto lub int i ponownie skompilować.
Istnieje jednak większy problem. Gdybyś miał
C i C ++ bardzo stary uczyniłoby (jak to będzie, jeśli zostało przerwane - deklaracja była domyślna ). Jeśli spędziłeś naprawdę dużo czasu bez kompilacji tego kodu lub korzystałeś ze starych kompilatorów, możesz mieć część tego kodu, przynajmniej teoretycznie. C ++ 11 sprawiłoby, że jest to, ponieważ właśnie tym jest 4.3. (A może a , wciąż jestem w trybie Boxing Day, ale chodzi o to, że nie .) To może wprowadzić subtelne błędy w twojej aplikacji. I bez żadnych ostrzeżeń i błędów z kompilatora. Ludzie w tej łodzi powinni szukać globalnie, aby upewnić się, że nie używali jej w stary sposób, zanim przejdą do kompilatora C ++ 11. Na szczęście taki kod jest niezwykle rzadki.
i
int
auto
int
double
float
int
auto
źródło
auto
jeśli po nim następuje nazwa typu?error C3530: 'auto' cannot be combined with any other type-specifier
do tej liniiauto i = 4.3;
, ponieważ był źle sformułowany w C ++ 03 / C ++ 98. C ++ nie przeniósł zasady „domyślnej int”, którą miał C89 (i zrezygnował z wersji C99).