Prima dell'introduzione del costruttore di movimento e del trasferimento di incarichi in C ++, avevo due chiare categorie concettuali di classi: valori per i quali l'uso di una copia non era diverso dall'uso del valore originale, entità per le quali era diverso. Per i valori, ho fornito il gestore della copia e l'operatore di assegnazione (e gli operatori di uguaglianza), per le entità che non l'ho fatto (se un'operazione di copia aveva senso, il costruttore di copie era esplicito e l'operazione di copia non era fornita dall'operatore di assegnazione; mai un concetto significativo).
L'introduzione di move ha introdotto una nuova categoria, e purtroppo non sembra aver trovato un criterio concettuale che mi consenta di fare la scelta di fornire operazioni di movimento o no per le classi non di valore. Attualmente, sono principalmente guidato da considerazioni sull'implementazione e questo mi rende insoddisfatto. Inoltre, di recente ho dovuto far evolvere una classe e ho dovuto scegliere se rimuovere le operazioni di spostamento o introdurre una complessità ingiustificata. Fortunatamente, le operazioni di spostamento sono state fornite e non utilizzate e la scelta non è stata quindi così difficile. Questo evento ha evidenziato il fatto che ho avuto un problema concettuale.
Come fare la scelta tra tipi non mobili e non mobili non commutabili senza affidarsi a dettagli di intuizione o implementazione?