Motivazione e insidie ​​(?) Della parola chiave auto in C ++ 11


20

Di recente mi chiedevo perché la parola chiave è autostata scelta in C ++ 11 per contrassegnare una variabile il cui tipo deve essere dedotto dal compilatore, come in

auto x = 1;

Da

  1. var sembra più comune in altri linguaggi di programmazione (ad es. C #, Scala, JavaScript) e
  2. Per quanto ho capito la nuova semantica della autocompatibilità all'indietro delle interruzioni (era usata raramente ma aveva un significato diverso nelle precedenti revisioni del C ++, vedi ad esempio qui )

Volevo chiederti se c'era un motivo speciale per scegliere auto(a favore varo qualsiasi altra parola chiave). C'è stata una discussione specifica su questo problema prima che fosse rilasciato lo standard C ++ 11?

Inoltre, ci sono possibili incompatibilità da tenere d'occhio quando si ricompila il codice C ++ legacy con un compilatore C ++ 11?


9
La nuova semantica di autopotrebbe rompere la compatibilità all'indietro, ma, a seconda della frequenza con cui varviene utilizzato come nome variabile rispetto alla frequenza con cui la autoparola chiave viene utilizzata nel codice pre-11, il comitato potrebbe aver ritenuto che interrompesse la compatibilità in modo meno drammatico rispetto all'introduzione di un nuovo parola chiave sarebbe.
sepp2k,

2
"Allo stato attuale, questa domanda non è adatta al nostro formato di domande e risposte. Ci aspettiamo che le risposte siano supportate da fatti, riferimenti o competenze specifiche, ma questa domanda probabilmente solleciterà dibattiti, argomenti, sondaggi o discussioni estese. Se ritieni che questa domanda possa essere migliorata e possibilmente riaperta, consulta le Domande frequenti per assistenza ". Ci sono due possibili risposte: SÌ e NO.
Giorgio,

2
Naturalmente c'è stata una discussione, che rende la domanda un po 'inutile al riguardo. La domanda autovs varè a cosa si riferisce il 90% del tuo testo e quella domanda non ha risultati definitivi. (anche se non sono io quello che ha votato per chiudere)
Telastyn il

1
@Telastyn: se avessi saputo che c'era stata una discussione su questo argomento, non avrei chiesto. Googling per "auto contro var C ++" o "auto C ++" non ha restituito nulla su questo argomento.
Giorgio,

1
autoè stato proposto per C ++ prima di varessere introdotto in C #, quindi la domanda dovrebbe essere perché C # non usa auto. var ha un significato diverso in JavaScript e Scala
adrianm,

Risposte:


37

Quasi ogni parola che potresti pensare di aggiungere come parola chiave a una lingua è stata quasi sicuramente utilizzata come nome di variabile o in qualche altra parte del codice di lavoro. Questo codice verrebbe infranto se la parola fosse trasformata in parola chiave.

La cosa incredibilmente fortunata autoè che era già una parola chiave, quindi le persone non avevano variabili con quel nome, ma nessuno lo usava, perché era l'impostazione predefinita. Perché digitare:

auto int i=0;

quando

int i=0;

significava esattamente la stessa cosa?

Suppongo che da qualche parte sul pianeta ci fosse una piccola quantità di codice che utilizzava "auto" alla vecchia maniera. Ma potrebbe essere risolto rimuovendo "auto" e funzionerebbe di nuovo. Quindi è stata una scelta abbastanza ovvia riutilizzare la parola chiave.

Mi capita anche di pensare che sia un significato più chiaro. Se hai lavorato con varianti e simili, quando vedi varpuoi pensare che la dichiarazione sia in qualche modo meno tipizzata rispetto a se hai premuto tu stesso tutti i tasti sulla tastiera per specificare il tipo di variabile. Per me, autochiarisco che stai chiedendo al compilatore di dedurre automaticamente il tipo, che è altrettanto forte come se lo avessi specificato tu stesso. Quindi è stata davvero una pausa molto fortunata che ha reso disponibile un buon nome al comitato.

Per chiarire la (piccola) rottura:

Se tu avessi

auto int i=0;

e ho provato a compilare con un compilatore C ++ 11, ora otterrai un errore come

errore C3530: 'auto' non può essere combinato con nessun altro specificatore di tipo

Questo è banale, basta rimuovere l'auto o l'int e ricompilare.

C'è un problema più grande però. Se tu avessi

auto i = 4.3;

C e il C ++ veramente vecchio farebbero iun int(come farebbe se si fosse interrotto auto- la dichiarazione di default era int). Se hai trascorso molto tempo senza compilare questo codice, o hai utilizzato vecchi compilatori, potresti avere un po 'di questo codice, almeno in teoria. C ++ 11 lo renderebbe un doubledato che è quello che è 4.3. (O forse un float, sono ancora in modalità Giorno di Santo Stefano, ma il punto è, non un int.) Questo potrebbe introdurre bug sottili in tutta la tua app. E senza avvertimenti o errori dal compilatore. Le persone in questa barca dovrebbero cercare globalmente per autoassicurarsi che non lo stessero usando alla vecchia maniera prima di passare a un compilatore C ++ 11. Fortunatamente, tale codice è estremamente raro.


Grazie per una risposta molto chiara. +1 Comprendo il compromesso tra l'abbandono della compatibilità all'indietro in un modo per lo più innocuo e la grande possibilità che il vecchio codice non venga violato dalla nuova parola chiave.
Giorgio,

Esiste davvero alcuna incompatibilità? Un compilatore C ++ 11 non ignorerà semplicemente autose è seguito da un nome di tipo?
aaaaaaaaaaaa,

1
Visual C ++ 2012 dice error C3530: 'auto' cannot be combined with any other type-specifiera quella linea
Kate Gregory il

3
@KateGregory: In realtà, non ci sono problemi auto i = 4.3;, perché era mal formato in C ++ 03 / C ++ 98. Il C ++ non trasportava la regola "implicita int" che il C89 aveva (e abbandonato nella revisione del C99).
Bart van Ingen Schenau,

1
@Kate Gregory: se potessi prendere in considerazione le osservazioni di Bart e modificare di conseguenza la tua risposta, la contrassegnerei come risposta accettata.
Giorgio,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.