Il problema è che i tipi non corrispondono e quindi non puoi creare un riferimento.
int b = 3;
int* ptr = &b;
int*& ptr_ref = ptr;
È legale.
int b = 3;
const int* ptr = &b;
const int*& ptr_ref = ptr;
È legale.
int b = 3;
int* ptr = &b;
const int*& ptr_ref = ptr;
È una mancata corrispondenza.
messaggio di errore G ++ s 'potrebbe essere utile a voi:
error: invalid initialization of non-const reference of type 'const int*&' from an rvalue of type 'const int*'
const int*& ptr_ref = ptr;
^
In sostanza significa, si è dovuto creare un const int*
per questa espressione, che è un rvalue (essenzialmente un oggetto temporaneo), e quindi non si può tieni un riferimento ad esso. Un modo più semplice per mettere che è, non si può fare quello che hai scritto per lo stesso motivo per cui questo è illegale:
int& added = 3 + 2;
A seconda della situazione, si potrebbe risolvere questo semplicemente rimuovendo la designazione di riferimento. La maggior parte dei compilatori produrrà assemblaggi identici con o senza, almeno quando ottimizzati, grazie alla loro capacità di comprendere il fatto che il nome della variabile è solo un alias.
Ci sono anche alcuni casi references can perform worse, che a seconda delle vostre intenzioni potrebbero valere la pena conoscere - Sono rimasto sorpreso di saperlo quando l'ho scoperto.
fonte
2016-05-20 21:44:39
non chiaro dal testo, ma volevi dire che 'ptr_ref' non dovrebbe essere in grado di modificare' ptr', o non essere in grado di modificare 'b'? –