Załóżmy, że mam klasę Foo że posiada prywatny wskaźnik do Bar:Czy dopuszczalne jest odrzucenie constness w konstruktorze ruchu?
class Foo
{
private:
Bar * bar;
public:
Foo() : bar (new Bar())
{}
~Foo()
{
delete bar;
}
};
Jeśli wskaźnik bar
nigdy nie powinien być przeniesiony do innej instancji, to ma sens, aby ten sam wskaźnik const
żeby mnie zatrzymać (lub opiekunowie) od tego w przyszłości:
private:
Bar * const bar;
Lubię robić to gdzie nadarzy się okazja.
Gdybym wtedy chciałem napisać konstruktora poruszać, będzie to wyglądać mniej więcej tak:
Foo (Foo && f) :
bar (f.bar)
{
f.bar = NULL; // uh oh; f.bar is const.
}
mogę „make błąd odejść” albo przez odlewanie z dala constness z f.bar
lub nie czyni go const w pierwszej kolejności. Żadne z tych rzeczy nie chcę robić. Wolałbym nie usunąć całkowicie, ponieważ jest z jakiegoś powodu. Z drugiej strony, rzucanie dzwonów alarmowych dla mnie jest czymś, czego zwykle nie robię. Moje pytanie brzmi: czy uważa się za akceptowalną praktykę odrzucenie konsternacji w konstruktorze ruchu takim jak ten? Czy istnieje lepszy sposób, którego nie rozważałem?
nie sądzę, moje pytanie jest taki sam jak ten: Use const_cast to implement the move constructor
Jeśli chcesz zmienić 'bar', to całkiem wyraźnie nie powinno to być' const'. Pomyśl dokładnie o swoim projekcie. – user657267
Wygląda na to, że twoja klasa nie powinna być ruchoma. – juanchopanza
Użycie const_cast tutaj jest niezdefiniowanym zachowaniem. –