Ho una classe con un distruttore eliminata (in pratica, ha bisogno di un aiuto esterno per essere distrutta):uso implicito del distruttore
struct indestructible {
indestructible(indestructible&&);
~indestructible() = delete;
};
Quando provo ad usare il suo costruttore mossa, il compilatore si lamenta:
struct user {
indestructible ind;
user(indestructible&& ind) : ind(std::move(ind)) {}
};
indestructible.cc:11:3: error: attempt to use a deleted function
user(indestructible&& ind) : ind(std::move(ind)) {}
^
indestructible.cc:6:3: note: '~indestructible' has been explicitly marked deleted here
~indestructible() = delete;
Cosa sta succedendo? non ci sono altri membri che possono lanciare, e nemmeno il corpo del costruttore, quindi perché c'è qualche motivo per il costruttore di movimento di invocare il distruttore?
Se "indistruttibile" non può essere distrutto, come può essere distrutto qualsiasi oggetto che lo contiene? –
Si noti che il distruttore di 'user' tenterà ancora di distruggere' ind' – JSQuareD
Una soluzione (leggermente) migliore di un distruttore eliminato potrebbe essere un distruttore privato o protetto e l'utente deve derivare o essere amico. In alternativa è possibile progettare l'oggetto in modo che possa effettivamente avere un normale distruttore e il lavoro speciale da eseguire nel costruttore invece l'utente –