C ++ Являются ли данные производного объекта гарантированно действительными после базового объекта std :: swap?

это безопасно сделать что-то вроде этого:

class Base { public: int x; };
class Derived : public Base { public: int y; };
Base b;
Derived d;
b.x = 1;
d.x = 2;
d.y = 3;
std::swap(b,d);

На этом этапе гарантируется, что производная информация d.y все еще действительна? Другими словами, я только меняю базовый объект, но производные данные все еще действительны, правильно? Кроме того, это считается нарезка?

РЕДАКТИРОВАТЬ: В комментариях было указано, что это не скомпилируется. Какой лучший способ поменять базовые данные в d на b? Имейте в виду, что b очевидно намного сложнее, чем я привел в своем примере.

1

Решение

Все зависит от того, что ваше определение действительный и насколько точен объем вопроса. В общем случае, просто поменять базы не будет действительный, поскольку производный тип может применять дополнительные инварианты, которые могут быть нарушены.

В конкретном случае у вас есть, без инвариантов, все общедоступные данные (после исправления определений типов, так что код ниже компилируется), данные будут поменяны местами и, скорее всего, не вызовут никаких проблем (предположим, что изменение в свопе может быть сделано вручную путем прямого доступа к членам, поэтому swap не ломается ничего, что иначе не сломалось бы).

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]