Supponiamo che ho una classe Foo che ha un puntatore privato ad una Bar:È accettabile eliminare la costanza in un costruttore di mosse?
class Foo
{
private:
Bar * bar;
public:
Foo() : bar (new Bar())
{}
~Foo()
{
delete bar;
}
};
Se il puntatore bar
dovrebbe mai essere riassegnato a una diversa istanza, allora ha senso per rendere il puntatore stesso const
al fine di fermare me (o un manutentore) dal farlo in futuro:
private:
Bar * const bar;
mi piace fare questo ovunque l'occasione.
Se dunque io volevo scrivere un costruttore mossa, sarebbe simile a questa:
Foo (Foo && f) :
bar (f.bar)
{
f.bar = NULL; // uh oh; f.bar is const.
}
posso "fare l'errore di andare via" o gettando via la costanza di f.bar
o non farcela const in primo luogo. Nessuno dei quali sono cose che voglio fare. Preferirei non rimuovere completamente il const perché è lì per un motivo. D'altra parte, gettare la costanza suona campanelli d'allarme per me ed è qualcosa che non faccio mai. La mia domanda è: è considerata una pratica accettabile per gettare via la costanza all'interno di un costruttore di mosse come questo? C'è un modo migliore che non ho considerato?
non credo che la mia domanda è la stessa come questo: Use const_cast to implement the move constructor
Se è necessario modificare 'bar', in modo abbastanza chiaro non dovrebbe essere' const'. Pensa attentamente al tuo design. – user657267
Sembra che la tua classe non debba essere spostata. – juanchopanza
L'utilizzo di const_cast qui è un comportamento non definito. –