Motywacja i pułapki (?) Słowa kluczowego auto w C ++ 11

20

Ostatnio zastanawiałem się, dlaczego słowo kluczowe autozostało wybrane w C ++ 11 do oznaczenia zmiennej, której typ musi zostać wyprowadzony przez kompilator, jak w

auto x = 1;

Od

  1. var wydaje się bardziej powszechny w innych językach programowania (np. C #, Scala, JavaScript) i
  2. O ile rozumiem nową semantykę autozgodnoś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ść varlub 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?

Giorgio
źródło
9
Nowa semantyka automoże zepsuć wsteczną kompatybilność, ale w zależności od tego, jak często varjest używana jako nazwa zmiennej w porównaniu do tego, jak często autosł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.
sepp2k
2
„W obecnej formie to pytanie nie pasuje do naszego formatu pytań i odpowiedzi. Oczekujemy, że odpowiedzi będą poparte faktami, referencjami lub konkretną wiedzą specjalistyczną, ale to pytanie prawdopodobnie zachęci do debaty, argumentów, ankiet lub rozszerzonej dyskusji. Jeśli czujesz, że to pytanie można poprawić i ewentualnie ponownie otworzyć, zobacz wskazówki w FAQ. ”: To pytanie dotyczy faktu: czy była dyskusja na ten temat. Istnieją dwie możliwe odpowiedzi: TAK i NIE.
Giorgio
2
Oczywiście odbyła się dyskusja, co sprawia, że ​​pytanie jest w tym względzie bezcelowe. autoVs varpytanie 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)
Telastyn
1
@Telastyn: Gdybym wiedział, że była dyskusja na ten temat, nie zapytałbym. Googling dla „auto versus var C ++” lub „auto C ++” nic nie zwrócił na ten temat.
Giorgio
1
autozostało zaproponowane wcześniej dla C ++ varw C #, więc pytanie powinno brzmieć dlaczego C # nie używa auto. var ma inne znaczenie w JavaScript i Scala
adrianm

Odpowiedzi:

37

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ą autojest 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ć:

auto int i=0;

kiedy

int i=0;

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 mnie autoto 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ł

auto int i=0;

i próbowałeś skompilować z kompilatorem C ++ 11, teraz pojawi się błąd taki jak

błąd C3530: „auto” nie może być łączony z żadnym innym specyfikatorem typu

Jest to trywialne, wystarczy usunąć auto lub int i ponownie skompilować.

Istnieje jednak większy problem. Gdybyś miał

auto i = 4.3;

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.iintautointdoublefloatintauto

Kate Gregory
źródło
Dzięki za bardzo jasną odpowiedź. +1 Rozumiem kompromis między rezygnacją z kompatybilności wstecznej w sposób w większości nieszkodliwy a dużą szansą, że stary kod nie zostanie uszkodzony przez nowe słowo kluczowe.
Giorgio
Czy w ogóle istnieje jakakolwiek niezgodność? Czy kompilator C ++ 11 nie zignoruje tylko, autojeśli po nim następuje nazwa typu?
aaaaaaaaaaaa
1
Visual C ++ 2012 mówi error C3530: 'auto' cannot be combined with any other type-specifierdo tej linii
Kate Gregory
3
@KateGregory: Właściwie nie ma z tym problemu auto 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).
Bart van Ingen Schenau
1
@Kate Gregory: Gdybyś mógł wziąć pod uwagę spostrzeżenia Barta i odpowiednio zmienić swoją odpowiedź, oznaczę ją jako odpowiedź zaakceptowaną.
Giorgio