Nel libro di Scott Meyer Effective moderna C++ si legge, che:auto e static_casts - le buone pratiche
std::vector<bool> features(const Widget& w);
Widget w;
…
bool highPriority = features(w)[5];
…
processWidget(w, highPriority);
e un'opzione con auto
auto highPriority = features(w)[5];
che provoca un comportamento indefinito, a causa della Infatti, features()
restituisce std::vector<bool>
, che utilizza l'oggetto proxy di tipo std::vector<bool>::reference
quando restituisce un valore da opearator[]
.
Come soluzione a questo si consiglia di non interrompere l'utilizzo di auto
, ma utilizzando static_casts
.
Così Scott Meyers consigli d'uso:
auto highPriority = static_cast<bool>(features(w)[5]);
invece di:
bool highPriority = features(w)[5];
La mia domanda è: Qual è la vera differenza tra i due? Secondo me sono entrambi uguali, perché entrambi i metodi rendono più difficile il refactoring nello stesso modo (cambiare il tipo di valore di ritorno nelle funzioni della funzione non rende la variabile highPriority un tipo diverso) e la seconda è più breve da scrivere.
Solo un sospetto, ma in cima alla mia testa non riesco a pensare a una differenza funzionale, e l'unica ragione di Scott potrebbe essere la coerenza - non ha sostenuto l'uso di 'auto x =' per pratico tutto da qualche parte nello stesso libro ...? (O forse era un articolo online che ho visto ...) –
@TonyD Sì, la coerenza è probabilmente la ragione. Suggerisce di "preferire' auto' a dichiarazioni di tipo esplicite "nell'articolo 5 – TartanLlama
Direi che la prima soluzione dice esplicitamente al lettore" la cosa non è un bool, ma voglio che sia un bool ". La seconda soluzione di solito dice al lettore "che è un bool o almeno può essere usato come tale" ma il problema è che la maggior parte dei lettori lo legge come "quello è un bool" e probabilmente "hey, ora abbiamo" auto ", quindi scriviamo 'auto highPriority = features (w) [5];'! ", e boom. Anche se entrambe le soluzioni sono tecnicamente identiche, il lettore è avvisato nel primo caso che potrebbe esserci un problema con l'uso di 'features (w) [5]' direttamente. A proposito, lo stesso problema si verifica con cose come i modelli di espressione. – leemes