什么是好的返回类型`boost :: shared_ptr <structa>`?</structa>

时间:2012-07-25 15:22:04

标签: c++ boost

该函数需要返回指向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 的原因如下:

  1. 返回const shared_ptr,这样该函数的调用者不应该更改返回的shared_ptr,这可能指向内部数据结构

  2. 以引用方式返回,以便我可以避免使用shared_ptr的引用计数+/-

  3. shared_ptr包含const StructA&amp;,因此调用者无法更改const shared_ptr的内容。如果我是对的,即使shared_ptr是const,它也不能阻止调用者更改指向的数据,除非数据是const。

    1. 如果我犯了任何错误,请纠正我的理解
    2. 为此功能提供最佳回复签名。
    3. 谢谢

1 个答案:

答案 0 :(得分:2)

这取决于功能的作用:

  • 是否正在创建StructA的新对象?如果是,那么您必须返回shared_ptr。
  • 的副本
  • 它只是提供对您知道在返回的引用下不会过期的StructA对象的访问权限吗?然后你可以返回const&amp;在它上面(但不要 - 见下文)

你自己怀疑,const&amp; on shared_ptr不会阻止对它指向的对象的非const访问 - 它只是意味着shared_ptr对象本身是常量,不能被重置或指向其他对象。在这种情况下,shared_ptr的语义与普通指针的语义相同。

我曾经使用过const&amp;返回访问指针时很多很多。但最终它会导致非常微妙的错误,尤其是在多线程代码中(我很小心,但我仍然被咬了)。所以上面的peachykeen的评论是现货,我遵循所有新代码的成语。返回时不仅要注意回报,还要考虑函数参数是shared_ptr。最后你真的想要知道,只要你有一个shared_ptr指向的对象 - 你真的拥有它而不仅仅是一个long dead对象的shared_ptr的引用