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

20

Recentemente mi sono chiesto perché la parola chiave auto sia stata scelta in C ++ 11 per marcare 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 esempio C #, Scala, JavaScript) e
  2. Per quanto ne so, la nuova semantica di auto interrompe la compatibilità con le versioni precedenti (era usata raramente ma aveva un significato diverso nelle revisioni precedenti di C ++, vedi ad esempio here )

Volevo chiedere se ci fosse un motivo speciale per scegliere auto (a favore di var o qualsiasi altra parola chiave). C'è stata una discussione specifica su questo problema prima che venisse rilasciato lo standard C ++ 11?

Inoltre, ci sono eventuali incompatibilità da tenere in considerazione quando si ricompila il codice C ++ legacy con un compilatore C ++ 11?

    
posta Giorgio 27.12.2012 - 15:33
fonte

1 risposta

36

Quasi ogni parola che potresti pensare di aggiungere come parola chiave a una lingua è quasi certamente stata usata come nome di una variabile o qualche altra parte del codice funzionante. Questo codice verrebbe interrotto se si rendesse quella parola una parola chiave.

La cosa incredibilmente fortunata su 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é scrivi:

auto int i=0;

quando

int i=0;

significava esattamente la stessa cosa?

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

Penso anche che sia un significato più chiaro. Se hai lavorato con varianti e simili, quando vedi var potresti pensare che la dichiarazione sia in qualche modo meno strongmente tipizzata rispetto a quando hai premuto tutti i tasti tu stesso sulla tastiera per specificare il tipo di variabile. Per me, auto rende più chiaro che stai chiedendo al compilatore di dedurre automaticamente il tipo, che è altrettanto strong come se lo avessi specificato tu stesso. Quindi è stata davvero una rottura 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 riceverai un errore come

error C3530: 'auto' cannot be combined with any other type-specifier

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 vecchio C ++ renderebbero i an int (come sarebbe se tu avessi lasciato fuori auto - la dichiarazione di default era int ). Se hai passato 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 double poiché è ciò che è 4.3. (O forse un float , sono ancora in modalità Boxing Day, ma il punto è, non un int .) Questo potrebbe introdurre bug sottili in tutta la tua app. E senza alcun avvertimento o errore dal compilatore. Le persone in questa barca devono cercare globablly per auto per assicurarsi che non la usassero alla vecchia maniera prima di passare a un compilatore C ++ 11. Fortunatamente, tale codice è estremamente raro.

    
risposta data 27.12.2012 - 15:51
fonte

Leggi altre domande sui tag