Francamente, trovo meno confusione se una variabile è o const
o no, che se questo può cambiare.
Elaborare un po 'su questo: La ragione per cui di solito si vuole fare questo è perché non è possibile inizializzare una variabile const
il modo in cui si desidera. std::vector
è un buon esempio di questo. Beh, per una volta, il prossimo standard introduce una sintassi di inizializzazione universale che rende possibile tutto ciò:
const std::vector<int> cvi = { 1, 2, 3, 4, 5, 42 };
Tuttavia, anche senza roba C++ 1x' a portata di mano, e anche con i tipi che non consentire questa sintassi di inizializzazione, è possibile creare sempre una funzione di supporto per fare ciò che si vuole:
const std::vector<int>& cvi = create_my_vector();
o, se si vuole essere di fantasia:
const std::vector<int>& cvi = compile_time_list<1,2,3,4,5,42>::create_vector();
Annotare la &
. Non ha senso copiare il risultato della chiamata di funzione, poiché il binding di un valore di rvalue a un riferimento const
estende la sua durata fino alla fine della durata del riferimento.
Naturalmente, la ricompilazione con un compilatore che supporta C++ 1x 'semantica di spostamento renderà tali ottimizzazioni praticamente inutili. Ma legare un rvlaue a un riferimento const
potrebbe essere ancora più veloce dello spostamento di un vettore ed è improbabile che sia più lento.
Con C++ 1x, è possibile creare anche funzioni lambda che lo facciano al volo. C++ fornisce solo un enorme arsenale di strumenti. IME, non importa quanto tu abbia pensato, qualcun altro dovrebbe venire con un'altra idea per fare la stessa cosa. E spesso uno migliore del tuo.
Tuttavia, IME questo problema in genere viene fornito con troppo codice in troppo poche funzioni. E poi non si applica solo alla costanza, ma anche a tratti simili - come a cui si riferisce un riferimento.
Un classico è l'uso-uno-di-diversi-possibili-flussi.Invece di questo
int main(int argc, char* argv[])
{
std::istream* istrm = NULL;
std::ifstream ifs;
if(argc > 1)
{
ifs.open(argv[1]);
if(ifs.good())
istrm = &ifs;
}
if(!istrm)
istrm = &std::cin;
while(istrm->good())
{
// reading from *istrm implemented here
}
return 0;
}
solo dividere le preoccupazioni in 1) capire dove di leggere e 2) la lettura effettiva:
int read(std::istream& is)
{
while(is.good())
{
// reading from is implemented here
}
return 0;
}
int main(int argc, char* argv[])
{
if(argc > 1)
{
std::ifstream ifs(argv[1]);
if(ifs.good())
return read(ifs);
}
return read(std::cin);
}
devo ancora vedere un esempio reale di una variabile non era così costante come avrebbe potuto essere che non poteva essere risolto separando le preoccupazioni.
Cosa succede se si consola v in un solo ramo di un if-then-else? –
Quindi probabilmente dovrebbe essere 'const' solo in quell'ambito. – Frank
No. Non avrebbe senso. –