该函数需要返回指向shared_ptr
的{{1}}。
StructA
有很多选择,我相信其中一个是最好的(请指出是否有人离开)。
就个人而言,我更喜欢使用#0
struct StructA
{
// complicated struct that also holds other sub-structure
....
};
const boost::shared_ptr<const StructA&>& GetStructA(...)
{...} #0.5
const boost::shared_ptr<const StructA>& GetStructA(...)
{...} #0
const boost::shared_ptr<StructA>& GetStructA(...)
{...} #1
const boost::shared_ptr<StructA> GetStructA(...)
{...} #2
boost::shared_ptr<const StructA>
{...} #3
boost::shared_ptr<StructA> GetStructA(...)
{...} #4
boost::shared_ptr<StructA>& GetStructA(...)
{...} #5
boost::shared_ptr<StructA&> GetStructA(...)
{...} #6
旧系统使用#2
const boost::shared_ptr<const StructA&>& GetStructA(...)
{...} #0
我更喜欢选择#0 的原因如下:
返回const shared_ptr,这样该函数的调用者不应该更改返回的shared_ptr,这可能指向内部数据结构
以引用方式返回,以便我可以避免使用shared_ptr的引用计数+/-
shared_ptr包含const StructA&amp;,因此调用者无法更改const shared_ptr的内容。如果我是对的,即使shared_ptr是const,它也不能阻止调用者更改指向的数据,除非数据是const。
请
谢谢
答案 0 :(得分:2)
这取决于功能的作用:
你自己怀疑,const&amp; on shared_ptr不会阻止对它指向的对象的非const访问 - 它只是意味着shared_ptr对象本身是常量,不能被重置或指向其他对象。在这种情况下,shared_ptr的语义与普通指针的语义相同。
我曾经使用过const&amp;返回访问指针时很多很多。但最终它会导致非常微妙的错误,尤其是在多线程代码中(我很小心,但我仍然被咬了)。所以上面的peachykeen的评论是现货,我遵循所有新代码的成语。返回时不仅要注意回报,还要考虑函数参数是shared_ptr。最后你真的想要知道,只要你有一个shared_ptr指向的对象 - 你真的拥有它而不仅仅是一个long dead对象的shared_ptr的引用