C++是保证在基本对象std::swap之后有效的派生对象数据
C++ Is derived object data guaranteed valid after a base object 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显然比我举的例子要复杂得多。
这完全取决于您对有效的定义以及问题范围的精确程度。在一般情况下,仅交换基将不是有效的,因为派生类型可能会强制执行可能被破坏的附加不变量。
在没有不变量的特定情况下,所有公共数据(在修复类型定义以便编译下面的代码之后)都将被交换,并且很可能不会引起任何问题(假设:交换中的更改可以通过直接访问成员手动完成,因此swap
不会破坏任何原本不会破坏的内容)。
相关文章:
- 在之后仍需要使用源对象时调用父移动分配运算符
- 如何在初始化列表中的构造函数之后初始化变量/对象?
- 我想覆盖运算符'='但是在重载之后,运算符没有将正确的信息传递给对象
- 即使在 C++ 中的 fstream.clear() 之后,对象也没有被保存
- 在 std::move 之后使用对象不会导致编译错误
- 向量迭代器在新对象的 push_back() 之后不兼容
- 类的堆分配对象是否在其作用域之后但在 C++ 中调用其析构函数之前处于活动状态
- 成员对象的地址在构造函数之后立即更改
- 在计算了一帧的SIFT或ORB之后,如何实时跟踪视频中的对象
- 对对象的数据成员的shared_ptr是否使数据成员在对象的生存期之后保持活动状态
- 在 Haar 级联 opencv 之后跟踪对象
- C++保存绑定对象并在ASIO之后使用它
- 如果我在 for 中声明一个对象,它的内存是否会在那之后被释放?
- C++是保证在基本对象std::swap之后有效的派生对象数据
- 在C++中,构造函数是在对象创建之前或之后调用的
- 函数对象在for_each之后丢失了数据成员的值
- Do all运算符重载将运算符放在将调用重载的对象之后
- 对象似乎正在删除自己,或者在构造函数之后内存发生了变化
- 类对象(char)在函数之后发生更改
- 在显式销毁对象之后但在其内存被释放之前调用成员函数是否合法?