这是一种更好的方法 - 将`const reference`与`boost :: shared_ptr <Class>`存储为成员变量

q09*_*987 2 c++ boost

class ClassOne : boost::noncopyable
{
};

class ClassTwo : boost::noncopyable
{
public:
    ClassTwo(const ClassOne& one)
        : m_one ( one ) {}

private:
    const ClassOne& m_one;
};

class ClassThree : private boost::noncopyable
{
public:
    ClassThree(boost::shared_ptr<const ClassOne> one)
        : m_one ( one ) {}

private:
    boost::shared_ptr<const ClassOne> m_one;
};

class ClassFour : private boost::noncopyable
{
public:
    ClassFour(const boost::shared_ptr<const ClassOne>& one)
        : m_one ( one ) {}

private:
    boost::shared_ptr<const ClassOne> m_one;
};
Run Code Online (Sandbox Code Playgroud)

问题>在代码查看期间,我被告知代码(类似ClassTwo)应该被代码替换(类似ClassThree),因为将const引用存储到外部类是不安全的.

真的吗?

谢谢

ere*_*non 6

Const参考和shared_ptr模型有两个相似但不同的概念.

如果你有一个const引用,你"知道"某些东西,你可以检查这个东西(通过const方法),但你不能改变这个东西,更重要的是,这个东西可能随时消失:你不拥有它.

另一方面,shared_ptr模拟共享所有权.您拥有指针指向的对象.你可以改变它,它不会被破坏,除非每个主人都被毁坏.

将const引用返回给私有成员是安全的; 接受这样的参考是另一回事.您必须确保引用仍然有效.

shared_ptr 更容易处理,但它是一个更昂贵的解决方案.

关于确切的动态,请阅读手册shared_ptr