2016-05-20 11 views
6

Perché viene visualizzato un errore durante l'esecuzione? Mi aspettavo che ptr_ref non fosse in grado di modificare l'indirizzo in cui ptr sta puntando, ma le cose non sembrano andare come previsto.const riferimento a un puntatore che non si comporta come previsto

int b = 3; 
int* ptr = &b; 
//says something about cannot convert int* to type const int*& 
const int*& ptr_ref = ptr; 

Grazie in anticipo, 15 yr old C++ niubbo

+0

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'? –

risposta

10

ptr_ref è dichiarata non come riferimento const al puntatore a int, ma piuttosto un riferimento al puntatore a const int, in modo da avere un tipo non corrispondente. Si dovrebbe fare

int* const& ptr_ref = ptr; 
+0

Grazie mille sì, capisco molto bene che la parola chiave 'const' fa parte del tipo in C++ ma man quelle dichiarazioni di tipo possono diventare molto fastidiose Grazie mille signore. –

+0

Ha dichiarato che voleva che int fosse 'const'. Ciò consentirebbe di essere mutabile, ma non il puntatore stesso. –

+0

@WilliamKappler La domanda dice "mi aspetto ... di non poter modificare l'* indirizzo *", che ho interpretato come volendo che il puntatore fosse const. – Brian

-3

Un riferimento è const intrinsecamente, quindi non c'è alcun punto veramente nel definire come int *& const ptr_ref = ptr Quando si parla di un riferimento const, significa di solito un riferimento ad un const, che è il definizione che hai usato nella tua domanda.

[modifica] A cura mia risposta come avevo messo il const per errore sul lato sbagliato della commerciale - C++ non perdona voi [/ modifica]

+0

Bene se si ha un riferimento non const a un puntatore il riferimento è in grado di modificare il valore in cui il puntatore punta a ciò che stavo cercando di fare è limitare il riferimento dall'essere in grado di farlo. –

+0

'int * const & ptr_ref' è un riferimento a un puntatore const a int (e c'è sicuramente un punto ad esso). Il 'const' si applica al puntatore, non al riferimento. Per applicare al riferimento, sarebbe 'int * & const', che non è la sintassi legale (probabilmente perché è ridondante, poiché, come hai affermato, un riferimento è inerentemente const). –

+0

@BenjaminLindley. 'int * & const' non è una sintassi legale perché l'identificativo const non può essere applicato a un riferimento (e il compilatore lo dirà). Aspetto diverso è 'int * const &' che significa un riferimento a un puntatore const a non-const int, che è legale, ed è ciò che l'OP sta chiedendo. Ho ricevuto una risposta negativa alla mia risposta probabilmente perché non l'hanno capito chiaramente (o non l'ho spiegato correttamente) – ad3angel1s

3

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.

+0

Grazie, ti avrei tenuto come risponditore di questa domanda Se fossi stato prima, ma sì, ** int * const & ptr_ref = ptr; ** risolto il mio problema ora capisco che prima quello che stavo facendo era cercare un riferimento a un const int * ma ora capisco che è sbagliato. Grazie mille! –

+0

@funTertain, È possibile modificare una risposta accettata se una nuova risposta aiuta più di un'altra. La risposta accettata è la prima che viene mostrata ai visitatori futuri, quindi, idealmente, sarebbe quella più utile in media. – chris

+0

@funTertain Come ho sottolineato nel mio altro commento, con 'int * const & ptr_ref = ptr;', l'int stesso è ancora mutevole. Per chiarire, posso fare: '* ptr_ref = 4;' e il compilatore lo renderà felicemente. Dovresti, a mio parere, avere * entrambe le designazioni '' const'. Sembra che tu voglia il valore 'int'' const', ma è anche una pessima idea lasciare il puntatore mutabile. Scriverò l'espressione 'const int * const ptr_ref = ptr;'. È davvero il riferimento che è la parte che ha poco senso. –

Problemi correlati