Penso che il tipo divariant
di C ++ al 17% offra un aspetto interessante del problema della lingua rispetto alla libreria.
Il tipo di C ++ 17 variant
ha avuto una storia lunga e semi tortuosa nel suo sviluppo. Il grosso problema è stato come affrontare il lancio di costruttori durante l'assegnazione / collocazione in un oggetto live variant
.
L'ovvio desiderio sarebbe quello di fornire la strong garanzia di eccezione: se il nuovo oggetto getta durante copia / sposta / installa in variant
, allora variant
rimane invariato. Ma l'implementazione ha problemi. Il sizeof
desiderato per un variant
è quello di un equivalente union
+ a char
per discriminare al loro interno.
Ciò significa che se si assegna / si inserisce in una variante, devono avvenire 2 cose: distruggere il vecchio valore, quindi costruire il nuovo valore al suo posto. È il n. 2 che fallisce; il vecchio valore è andato . Non puoi riprenderlo.
Potresti provare a giocare, come spostare il vecchio valore in un temporaneo, quindi spostarlo indietro se la costruzione del nuovo fallisce. Ma le operazioni di spostamento possono lanciare e ci sono persino tipi di libreria standard con mosse di lancio. Puoi provare a raddoppiare i dati (memorizzare i dati 2x, in modo da avere sempre un margine temporaneo), o anche allocare memoria come boost::variant
, ma quelli sono stati considerati inaccettabili dal comitato.
Per un variant
basato sulla lingua, questo ovviamente non sarebbe un problema. Lo standard dichiarerebbe semplicemente da fiat che offre la strong garanzia di eccezione e che è dimensionato in modo appropriato, non alloca memoria, ecc. I compilatori dovrebbero usare la magia del compilatore per farlo funzionare.
Tuttavia ... e se potessimo semplicemente esporre quel "magic del compilatore" come una caratteristica del linguaggio di prima classe ? Ad esempio, questa proposta suggerisce un modo per fare una mossa efficace costruttori che non lanciano. In questo modo, ora possiamo utilizzare il metodo temporaneo per implementare variant
.
Questo ti offre la maggior parte se non tutti i vantaggi di una lingua variant
, ma anche ti fornisce strumenti che puoi usare per rendere più efficiente l'altro codice.
Se cerchi di inserire qualsiasi cosa nella lingua, ciò che scoprirai è che farai dipendere eccessivamente gli utenti dalla lingua, piuttosto che usare la lingua per dare agli utenti gli strumenti per costruire ciò di cui hanno bisogno. Questo è particolarmente importante per un linguaggio di basso livello (er) come C ++.