Dovrei sentirmi "a disagio" usando l'auto in C ++? [duplicare]

6

C ++ 11 presenta la nuova dichiarazione di tipo auto , che consente di lavorare con un oggetto senza mai conoscerne il tipo effettivo.

Io uso solo linguaggi strongmente tipizzati - C ++, Delphi (Object Pascal), Go, ecc. e mi sento a disagio (colpevole?) usando auto , (o per esempio la dichiarazione di variabile breve - x:=1 - in Go. Mi sembra un trucco: io uso le lingue strongmente tipizzate perché garantiscono che tu sappia che tipo stai usando. (Ad eccezione dell'abuso di puntatori non tipizzati.) Anche se certamente apprezzo i benefici: nomi di tipi corretti che coinvolgono iteratori, modelli, puntatori intelligenti ecc. Possono diventare molto lunghi e un po 'difficili da determinare e dichiarare esplicitamente o da analizzare durante la lettura. Certo, una volta che conosci il nome corretto del tipo, puoi "digitarlo", ma a volte farlo bene la prima volta richiede molto tempo e non è sempre così facile.

Oppure immagina che tu erediti un progetto ampio e complesso che devi modificare e ogni variabile possibile in quel progetto sia dichiarata usando auto - dovrai fare molto più lavoro per capire quel codice -base che se tutto è stato dichiarato usando tipi espliciti.

Quindi, quali sono alcune linee guida su quando utilizzare auto e quando esportarlo con nomi di tipi completi e corretti? Attualmente sto leggendo il A Tour of C ++ di Stroustrup e lui stesso nel Capitolo 1 sostiene l'utilizzo di auto in situazioni in cui sai che auto "va bene":

We use auto where we don’t have a specific reason to mention the type explicitly. “Specific reasons” include:

• The definition is in a large scope where we want to make the type clearly visible to readers of our code.

• We want to be explicit about a variable’s range or precision (e.g., double rather than float).

Nella sezione Consigli del Capitolo 1, inoltre, avverte:

-Prefer the {}-initializer syntax for declarations with a named type;

-Prefer the = syntax for the initialization in declarations using auto;

Questo, perché l'inizializzazione di default {} potrebbe causare un'inizializzazione errata del tipo.

Tuttavia, mi sento un po 'a disagio con auto .

Qualcuno può darmi qualche indicazione aggiuntiva sull'uso di auto , e / o sfatare la mia impressione che auto sia una sorta di hack e in realtà dovrebbe essere evitato per determinare il tipo corretto e quindi usare un typedef ?

    
posta Vector 19.05.2014 - 02:33
fonte

2 risposte

23

No, non dovresti sentirti a disagio con auto .

Usalo solo in situazioni in cui il tipo è ovvio, o in cui nessuno si prenderà cura di esso

Un esempio classico (IMO) di dove l'auto è utile:

std::vector<sometype> vec
...
...
//some code
...
...
for(auto iter = vec.begin(); iter != vec.end(); ++iter)
{
   //something here
}

A nessuno interessa veramente i dettagli della variabile iteratore ( std::vector<sometype>::iterator iter ), solo che è un iteratore. Specificando esplicitamente il tipo si aggiunge solo il rumore visivo. Spesso, senza auto , le persone creeranno typedef per gli iteratori comunemente usati, che possono oscurare i problemi e portare a qualche errore di errore se si utilizza typedef sbagliato.

    
risposta data 19.05.2014 - 03:05
fonte
5

Stai ancora diventando tipi forti anche se non sono specificati esplicitamente. Nella maggior parte dei casi, alla fine, si verificherà una mancata corrispondenza di tipo statico. La principale preoccupazione per l'inferenza di tipo sta accidentalmente inferendo un tipo troppo concreto o astratto. In altre parole, dedurre un tipo derivato quando era veramente necessario il tipo di base o viceversa. Se è importante quale tipo esatto ottieni, non utilizzare auto .

Un'altra preoccupazione relativa all'inferenza di tipo è se potrebbe cambiare l'interfaccia pubblica del tuo codice. In generale, dovresti rendere espliciti i tipi di interfaccia pubblica.

A parte queste circostanze, ci sono pochi motivi per non utilizzare auto quando semplifica il tuo codice.

    
risposta data 19.05.2014 - 05:12
fonte

Leggi altre domande sui tag