Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 62 di 93
  • livello avanzato
Indice lezioni

Reinterpret cast

L'operatore di conversione reinterpret_cast forza l'interpretazione del tipo di un'espressione, aggirando il controllo statico effettuato dal compilatore.
L'operatore di conversione reinterpret_cast forza l'interpretazione del tipo di un'espressione, aggirando il controllo statico effettuato dal compilatore.
Link copiato negli appunti

L'operatore reinterpret_cast è un particolare operatore di conversione che forza l'interpretazione del tipo di una determinata espressione, aggirando il controllo statico effettuato dal compilatore.

Quando si effettua una operazione di conversione mediante questo operatore, la sequenza di bit che rappresenta il valore dell'espressione da convertire è semplicemente interpretata come un valore corrispondente al tipo usato come parametro dell'operatore.

Ad esempio, è possibile effettuare la conversione di un puntatore ad un altro tipo arbitrario e del tutto incompatibile, senza che ciò dia luogo ad un errore di compilazione. Nel listato seguente, ad esempio, reinterpret_cast è usato per convertire il puntatore ad una variabile intera in un puntatore al tipo double.

int main()
{
int a = 123;
double* p = reinterpret_cast<double*>(&a);
return 0;
}

Questa conversione genererebbe, giustamente, un errore di compilazione se sostituissimo l'operatore reinterpret_cast con quello di conversione statica.

Nell'implementazione dell'operatore di conversione in stile C del linguaggio C++, reinterpret_cast è l'ultima spiaggia, impiegato laddove tutti gli altri operatori di conversione sono inapplicabili.

Tuttavia, anche l'applicabilità di questo operatore ha dei limiti. Ad esempio, esso non ha efficacia sui qualificatori const e volatile, per i quali è necessario ricorrere all'uso di const_cast.

Nella maggior parte dei casi, inoltre, lo standard garantisce che la riconversione al tipo originale ripristina il valore originale. Tuttavia, questa regola è soggetta a variabilità in base al compilatore in uso, in particolare quando la conversione è applicata a puntatori a metodi membri di classe.

Usi leciti di reinterpret_cast

Da un punto di vista formale, l'uso di reinterpret_cast costituisce sempre un rischio per la stabilità dell'applicazione, poichè è altamente probabile che da esso possano derivare errori critici. Inoltre, il suo impiego mina la portabilità del programma, ad esempio per architetture che adottano un ordine dei byte o endianness differente da quello di riferimento.

Tuttavia esso è parte della specifica del linguaggio poichè esistono degli scenari particolari in cui il suo impiego è imprescindibile. Ad esempio, l'uso di questo operatore è indispensabile quando si integrano librerie le cui API fanno riferimento a tipi opachi, cioè la cui definizione è volutamente nascosta.

Questo tipo di rappresentazione è tipica di librerie che modellano entità specifiche e particolari, come le risorse del sistema operativo. Nascondendo la definizione di una struttura dati, infatti, se ne limita le possibilità di manipolazione da parte del programmatore alle sole API che la libreria espone. Come conseguenza di ciò, l'implementazione della libreria può variare liberamente, purchè la sua interfaccia pubblica rimanga inalterata, senza che ciò comporti la necessità di ricompilare gli eseguibili che ne fanno uso tramite linking dinamico.

In questi casi, è tipico il ricorso all'operatore reinterpret_cast per manipolare gli argomenti o i valori restituiti delle API della libreria, in luogo di una conversione statica che darebbe origine ad errori di compilazione per via dell'impossibilità di verificare la compatibilità di tipo.


Ti consigliamo anche