繁体   English   中英

C++ 涉及智能指针时类成员的顺序很重要

[英]C++ Order of class members when smart pointers are involved matters

考虑这个片段:

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 一样?

成员的顺序总是很重要的。

智能指针的存在是一个红色的地方。 您示例中的关键只是一个成员的初始化取决于已经初始化的其他成员。

成员按照它们在类定义中出现的顺序进行初始化。 总是。

即使您在成员初始值设定项列表中以不同的顺序列出它们,它们仍然按照它们在类定义中出现的顺序进行初始化。 通常编译器会在顺序不同时发出警告。

您遇到类似的问题:

struct foo {
    int x;
    int y;
    foo() : x(1),y(this->x * 2) {}
};

更改xy的顺序将使初始化未定义( y将使用未初始化的x )。

但是这样的设计是不是有些脆弱?

是的。 当成员的初始化相互依赖时,您需要格外小心。

如果有人更改会员订单怎么办?

您将收到编译器警告,最好不要忽略。

是否有更好的/规范的设计,不需要依赖成员订单,或者就像 RAII 一样?

您可能不需要引用智能指针。 摆脱其中之一。 因为他们都是public所以让他们两个都没有意义。

一般来说,评论中提出的可能是一个解决方案。 如果您将一个成员重构为基类的成员,则初始化顺序毫无疑问,因为基类首先被初始化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM