In una classe variante sto lavorando stoccaggio crudo è un array di caratteri:reinterpret_cast/static_cast e comportamento indefinito
alignas(/* the strictest alignment of all types of the variant */)
char storage[/* ... */];
L'operatore di assegnazione è qualcosa di simile:
template<class X>
void operator=(const X &x)
{
// ...code for clearing the storage and setting the tag for type X...
new(storage) X(x);
}
mentre il codice per ottenere l'oggetto memorizzato è:
template<class X>
const X &get()
{
// ...
return *reinterpret_cast<X *>(storage);
// ...
}
Sembra funzionare ma è sempre ben definito? Sono preoccupato per il dereferenziamento sicuro del puntatore (è consentito dalle regole di tipo aliasing?).
Ci sono delle differenze tra l'implementazione corrente e
return *static_cast<const X *>(static_cast<const void *>(storage));
questione connessa/risposta:
https://stackoverflow.com/a/7321815/3235496 (vedi James Kanze 's commenti).
EDIT
Seconda domanda ha già una risposta qui: C++ When should we prefer to use a two chained static_cast over reinterpret_cast
Sicuramente questo 'nuovo (spazio di archiviazione) X (x);' è una perdita di memoria –
@EdHeal Costruisce X nell'archivio tramite il nuovo posizionamento. Dovrebbe essere una pratica sicura per lo storage allineato (ad esempio http://stackoverflow.com/questions/4583125/char-array-as-storage-for-placement-new). Potresti aggiungere qualche dettaglio? – manlio