Questo comportamento è più facile da capire quando guardiamo a cosa succede quando associamo un riferimento a un oggetto temporaneo. Se scriviamo
const int& reference_to_const_int = 20; //A temporay object int(20) is created.
il compilatore trasforma sopra il codice in qualcosa di simile a questo:
int temp = 20;
const int& reference_to_const_int = temp;
Se non fosse reference_to_const_int const, allora potremmo assegnare un nuovo valore a reference_to_const_int. Fare ciò non cambierebbe letteralmente il valore 20, ma cambierebbe invece la temperatura, che è un oggetto temporaneo e quindi inaccessibile. Se si desidera che solo i riferimenti const siano associati a valori che richiedono i temporanei, il problema viene completamente evitato poiché un riferimento const è di sola lettura.
Perché il C++ consente ai riferimenti const di accettare oggetti temporanei o RVALUES (come valori letterali)?
I luoghi più comuni che vediamo i riferimenti sono come argomenti di funzione o valori di ritorno. Quando un riferimento viene utilizzato come argomento di funzione, qualsiasi modifica al riferimento all'interno della funzione causerà modifiche all'argomento esterno alla funzione.
Se la funzione può prevedere/accettare oggetti temporanei o valori letterali come input e se la funzione rispetta la constatezza dell'oggetto, rendendo l'argomento un riferimento const consentirà di utilizzare la funzione in tutte le situazioni.
Gli oggetti temporanei sono sempre const, quindi se non si utilizza un riferimento const, tale argomento non verrà accettato dal compilatore.
void f(int&) {}
void g(const int&) {}
int main()
{
//f(1); //Error
g(1); //OK
}
fonte
2012-10-03 15:39:58
Legga questo: http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/ –
Dare un po 'più pensiero, sembra che * debba * essere legale. Se non lo fosse, non saresti mai in grado di impostarlo senza fare più variabili. –
@GigaWatt: di che cosa stai parlando? Credimi, se "it" * dovrebbe * essere legale, dovrebbe * essere *. :) –