2009-04-17 6 views

risposta

5

In teoria, potrebbero esserci architetture in cui un puntatore const ha una rappresentazione diversa rispetto a uno non const, nel qual caso il compilatore dovrebbe emettere del codice. Tuttavia, non sono a conoscenza di tali architetture.

+0

Intelligente, ma non vero: const è solo un attributo, non significa che non puoi scrivere (considera i membri mutabili). Se si sta progettando un'architettura in cui i puntatori di sola lettura e di lettura-scrittura o di sola scrittura sono diversi, il codice non verrà comunque generato nel cast, piuttosto nella scrittura stessa. – Suma

+1

Non ho intenzionalmente detto _quando_ il compilatore avrebbe dovuto emettere del codice. –

+1

Non ha importanza. Il const_cast rimuove l'ipotetico "bit di sola lettura" nel puntatore, così come scrive su un membro mutabile tramite un puntatore const. Quest'ultimo può essere rilevato con il 100% di acidità dal compilatore. – MSalters

12

No, rimuove solo l'attributo const al momento della compilazione.

3

const_cast getta via solo la costanza di un attributo e nient'altro.

2

const non modifica la rappresentazione di un tipo, in particolare, la rappresentazione di T* è esattamente la stessa di T const*.

consideri:

int i, 
    * const cpi = &i, 
    * const * pcpi = &cpi; 
int const * const * pcpci = pcpi; // cpi is now int const* 

La rappresentazione cpi allo stesso tempo rappresenta un int* e int const* via *pcpci.

Non è possibile modificare la rappresentazione di cpi quando viene inizializzato pcpci.

Ovviamente, se gli oggetti del puntatore hanno bit non significativi, il compilatore può capovolgerli casualmente; in particolare, const_cast può capovolgere i bit non significativi di un puntatore, ma anche qualsiasi conversione implicita. Non penso che questo caso esista nel mondo reale.

Lo stesso si applica quando due diversi schemi di bit generano lo stesso valore di indirizzo (base + offset quando l'offset è sufficientemente grande).