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;
};
问题&GT;在代码查看期间,我被告知代码(类似于ClassTwo
)应该被代码替换(类似于ClassThree
),因为将const引用存储到外部类是不安全的。
这是真的吗?
谢谢
答案 0 :(得分:6)
Const引用和shared_ptr
模拟两个相似但不同的概念。
如果你有一个const引用,你就知道&#34;有些东西,你可以检查这个东西(通过const方法),但你不能改变这个东西,更重要的是,这个东西可能随时消失:你不拥有它。
另一方面,shared_ptr
为共享所有权建模。您拥有指针指向的对象。你可以改变它,它不会被破坏,除非每个主人都被毁坏。
将const引用返回给私有成员是安全的;接受这样的参考是另一回事。您必须确保参考仍然有效。
shared_ptr
更容易处理,但它是一种更昂贵的解决方案。
关于确切的动态,请阅读 manual of shared_ptr
答案 1 :(得分:2)
我认为erenon写得很好。
我想从务实的角度补充一点:
const引用成员使类不可复制(事实上,它们可以是可复制的,但是禁止生成默认的特殊成员(析构函数除外)
shared_ptr使内容本身可复制(使用浅克隆语义)。事实证明,在状态将被保留/传递的仿函数中非常有用。 Boost Asio是一个很好的例子,因为执行的逻辑线程在线程之间蜿蜒而且生命周期很难实现。
我建议使用shared_ptr<const T>
;这会在共享的上下文中添加 immutability 。您将需要克隆指向的对象以使用更改的版本替换它,并且不会通过shared_ptr<const T>