如何在Modern C ++中表达不依赖所有权的参与关系?

时间:2015-12-23 16:42:10

标签: c++ pointers reference smart-pointers

从“一个不应该使用原始指针”这个成语的角度出发,我正在寻找智能指针来找到哪一个最符合引用关系。

通过引用关系,我的意思与此代码相同:

class A
{
public:

    A(B & b) : 
        m_refB( b ) 
    {   }

private:

    B & m_refB;    // A refers to B
};

但是没有使用引用的所有缺点(以后不能绑定,不能重新分配,A不能再默认构造等)。

然而,每个智能指针都以其自己的语义表达所有权概念。它们甚至以这种所有权概念命名(当所有权仅对一个对象是唯一的时,唯一指针,当所有权在更多对象之间共享时共享指针等)。

我想表达A指的是B,但A不属于B. std::reference_wrapper< B >可以完成这项工作,或者错误地使用它吗?

3 个答案:

答案 0 :(得分:13)

没有'不应该使用原始指针'这样的东西。 '不应该使用拥有原始指针'。使用引用成语的原始指针没有任何问题。智能指针对此只是一种矫枉过正。特别是std::weak_ptr:)

答案 1 :(得分:1)

这是std::weak_ptr的用途。它表示它指的是某种东西,但它并不拥有它,并且在引用它的对象消失之前,它可能会消失。

如果您确定需要引用的对象,则可以使用lock()向对象返回shared_ptr并延长其生命周期,直到shared_ptr超出范围。

答案 2 :(得分:1)

我认为answer提供的@SergeyA很棒并且我自己也投了赞成票。

但是,如果您真的不想在代码中看到原始指针,那么您始终可以创建一个用于传达所需语义的包装类。

例如:

llvm::Value*