【发布时间】:2020-11-16 10:31:24
【问题描述】:
考虑一下这个sn-p:
struct A
{
A(std::unique_ptr<int> somePtr_)
: somePtr{std::move(somePtr_)},
someInt{*somePtr}
{};
std::unique_ptr<int> somePtr;
const int& someInt;
};
这里,传递并存储了一个unique_ptr。
然后还会存储对基础数据的引用。
当A 的对象被销毁时,首先someInt 超出范围,然后somePtr。
恕我直言,当涉及到智能指针时,成员的顺序很重要,不是吗?
但是这个设计是不是有点脆弱?
如果有人更改会员顺序怎么办?
是否有更好/规范的设计,不需要依赖成员顺序,还是就像使用 RAII 一样?
【问题讨论】:
-
如果有人更改了成员顺序,那么让他们自己初始化 int 引用。要谈论更好的规范设计,首先要确定为什么需要这两个,一个指针和一个引用。
-
更好的解决方案可能是将
unique_ptr移动到(私有)基类中,或者使someInt成为成员函数而不是数据成员。
标签: c++ smart-pointers unique-ptr raii