C++是保证在基本对象std::swap之后有效的派生对象数据

C++ Is derived object data guaranteed valid after a base object std::swap?

本文关键字:对象 之后 swap 有效 数据 派生 std C++      更新时间:2023-10-16

这样做安全吗:

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显然比我举的例子要复杂得多。

这完全取决于您对有效的定义以及问题范围的精确程度。在一般情况下,仅交换基将不是有效的,因为派生类型可能会强制执行可能被破坏的附加不变量。

在没有不变量的特定情况下,所有公共数据(在修复类型定义以便编译下面的代码之后)都将被交换,并且很可能不会引起任何问题(假设:交换中的更改可以通过直接访问成员手动完成,因此swap不会破坏任何原本不会破坏的内容)。