【发布时间】:2019-03-23 20:48:39
【问题描述】:
它是否定义了行为来放置新的派生的可简单破坏的基础对象?
struct base { int& ref; };
struct derived : public base {
complicated_object complicated;
derived(int& r, complicated_arg arg) :
base {r}, complicated(arg) {}
};
unique_ptr<derived> rebind_ref(unique_ptr<derived>&& ptr,
int& ref) {
// Change where the `ref` in the `base` subobject of
// derived refers.
return unique_ptr<derived>(static_cast<derived*>(
::new (static_cast<base*>(ptr.release()) base{ref}));
}
请注意,我尝试构造 rebind_ref 以不破坏编译器可能做出的任何严格的别名假设。
【问题讨论】:
-
在这种情况下为什么不使用
int *ref。假设 ref 永远不会改变,可以编写派生类。 -
我的问题不是重新绑定参考。它是关于在派生的基础子对象之上构造一个“新”值。
-
重用内存会结束对象的生命周期。
标签: c++ inheritance strict-aliasing object-lifetime placement-new