La Rule of Five è ex idiomatica. Era solo un idioma per un brevissimo periodo prima della Regola dello Zero.
Il principio della Regola di 3 è diventato obsoleto quando la scrittura delle proprie classi di gestione delle risorse è diventata obsoleta, ovvero quando il compilatore supporta i riferimenti rvalue. Se implementi in termini di unique_ptr, che puoi virtualmente per ogni risorsa perché il deleter è così personalizzabile, hai solo bisogno di un assegnamento di copia personalizzato e di un costruttore di copia, quindi due. Se è necessario supportare la copia. Non c'è motivo di implementare il proprio distruttore, spostare l'operatore di assegnazione o spostare il costruttore nella stragrande maggioranza dei casi.
Il codice della regola dei tre non è rotto ma è molto più difficile da mantenere rispetto al codice della regola zero e non altrettanto efficiente. Le operazioni di spostamento offrono la correttezza in molti casi come unique_ptr
, quindi dovresti sforzarti di supportarle ovunque sia possibile.
Sono le operazioni di copia che ora sono ampiamente ridondanti di fronte alle mosse, non il contrario.
In altre parole, unique_ptr è così flessibile e le operazioni predefinite sono così utili che non c'è quasi mai alcun motivo per implementare i propri membri speciali. In effetti, non c'è praticamente alcun motivo per implementare le tue classi di gestione delle risorse. E dal momento che queste classi praticamente non esistono mai, non c'è motivo di avere un idioma per costruirle.