Perché i puntatori ai letterali non sono possibili?

2

Il riferimento a un valore letterale è possibile solo se il riferimento è dichiarato come costante.

Ma perché un puntatore a un oggetto const non è possibile in caso di valori letterali? cioè.

int const& ref = 5;//

Ma perché la stessa funzione non è disponibile per un puntatore, che punta a un oggetto costante?

    
posta sk patra 17.01.2014 - 10:36
fonte

3 risposte

6

Nella vista C ++ del mondo, un letterale non occupa memoria. Esiste solo un letterale.

Questa vista fa sì che non ci sia un indirizzo a cui fare riferimento un puntatore quando punta a un valore letterale e per questo motivo, i puntatori ai letterali sono proibiti.

I riferimenti Const sono in realtà l'eccezione qui in quanto consentono un accesso indiretto apparente a un letterale. Quello che succede sotto è che il compilatore crea un oggetto temporaneo per il riferimento a cui fare riferimento e quell'oggetto temporaneo viene inizializzato con il valore del riferimento.

Questa creazione di un temporaneo a cui il riferimento viene associato è solo consentito per i riferimenti const (e viene utilizzato anche in altri scenari, non solo per i letterali), perché questo è l'unico caso in cui un riferimento / puntatore a un temporaneo non avrà effetti collaterali indesiderati.

    
risposta data 17.01.2014 - 12:30
fonte
4

In C ++, i letterali esistono solo nel compilatore. Sono usati in espressioni, assegnazioni e inizializzazioni. Il valore di un valore letterale può essere trovato nel programma in esecuzione se è stato usato per inizializzare una variabile o temporanea, ma il letterale stesso non lo è.

Un nome che è un riferimento a un letterale ha un significato, perché un riferimento è un valore, in modo tale che ovunque venga utilizzato il nome può essere sostituito dal valore letterale stesso. In alcuni casi speciali viene sostituito da una variabile temporanea inizializzata su quel valore e il qualificatore const richiesto protegge quella variabile per essere modificata.

Un nome che è un puntatore a un letterale non ha significato. I puntatori si riferiscono a posizioni di archiviazione e un letterale non ne ha uno.

Sarebbe ipoteticamente possibile che C ++ permetta di puntare a valori letterali e di interpretarli come puntando a una variabile temporanea inizializzata su quel valore e presumibilmente per proteggere quel valore con un qualificatore const. Il motivo per cui non è stato definito in questo modo è (a) non è molto utile (b) sarebbe incompatibile con C. Dovresti chiedere a Bjarne di quello.

Si noti che quanto sopra si applica agli interi e ai float. Le stringhe letterali hanno regole diverse, perché in molti modi sono già puntatori const.

    
risposta data 19.01.2014 - 14:50
fonte
0

Secondo me, questo comportamento deriva dalle differenze semantiche di puntatori e riferimenti in C ++.

Il seguente frammento di codice con riferimento funziona bene:

const int& r = 5;
std::cout << &r << std::endl;

... poiché un oggetto temporaneo viene creato quando si assegna il valore al riferimento const e si può prendere l'indirizzo di quell'oggetto temporaneo.

Lo snippet di codice equivalente con il puntatore sarebbe il seguente:

const int *p = &5;
std::cout << p << std::endl;

Questo, tuttavia, non viene compilato, poiché &5 , cioè l'indirizzo di 5, non ha significato in C.

    
risposta data 11.03.2014 - 08:53
fonte

Leggi altre domande sui tag