2012-09-05 13 views
9

è sicuroÈ reinterpretato il cast dal vettore dei puntatori al vettore di puntatori const sicuri?

vector<int*> a; 
const vector<const int*>& b = reinterpret_cast<const vector<const int*>&>(a); 

Un cast statica, ovviamente, non funziona in questo caso questo tipo di conversione perché l'argomento modello sta cambiando. Ma facendo questo reinterpretare il cast, sto solo aggiungendo constness essenzialmente allo stesso tipo. Quindi dovrebbe essere sicuro per tutti gli scopi pratici?

+2

Un modo in cui potrebbe realisticamente andare storto (anche se non l'ho confermato da un test) è il rigoroso aliasing. L'ottimizzatore ha il diritto di presumere che 'b' non si riferisca alla stessa memoria di' a' (perché ha un tipo che non è compatibile per l'aliasing). Quindi l'ottimizzatore giocherà i suoi trucchi, e potresti scoprire che riordina o elita cose che non sarebbero riordinate o eliminate se 'a' e' b' * validamente * si riferivano alla stessa memoria. Quindi, il layout identico è una condizione necessaria ma non sufficiente per "funzionare". –

+1

Un altro modo di guardarlo è che il risultato di un 'reinterpret_cast' su un riferimento o un tipo di puntatore è * fondamentalmente * inutile e non funziona per qualcosa di diverso dalla conversione di nuovo al tipo originale, a meno che (a) il il tipo di destinazione è legale per l'aliasing del tipo effettivo dell'oggetto, oppure (b) hai una certa garanzia dalla tua implementazione che supporta la specifica cosa che stai facendo. Quando nessuno dei due si applica, non fare riferimento a un oggetto tramite un tipo diverso dal proprio. Ciò viene anche chiamato "punire tipicamente". –

risposta

7

Come qualsiasi utilizzo di reinterpret_cast per convertire un riferimento in un tipo non correlato, fornisce un comportamento indefinito, quindi non è sicuro a meno che non si definisca "sicuro" come "funziona sul mio compilatore".

+0

Non sarebbe corretto assumere che il vettore di un puntatore abbia la stessa struttura dopo tutto sono solo indirizzi. Oppure la struttura può effettivamente cambiare a causa del tipo di puntatore. – user1353535

+3

@ user1353535: No, l'implementazione della libreria è libera di specializzare il modello come preferisce. Non è necessario che diverse specializzazioni siano compatibili con il layout. –

+0

Quindi se è un tipo definito dall'utente che la libreria non può forse specializzare, allora? – user1353535

Problemi correlati