通过引用为boost :: shared_ptr创建别名

时间:2016-05-28 04:57:37

标签: c++ multithreading boost reference shared-ptr

我需要优化一小段代码。线程' A'已经为堆对象创建了一个boost shared_ptr。线程' A'将shared_ptr写入线程安全队列。线程' B'读取shared_ptr,使用它,然后销毁它。

强烈的分析/测试证明,复制进入/退出队列并调整引用计数的shared_ptr是昂贵的。因此,我想通过引用将共享ptr传递给队列。我还想使用std :: move将shared_ptr移动到队列中,而不是构造一个新的shared_ptr,(我知道这会使传递给队列的shared_ptr参数无效)。

所描述的一切都很好,直到我混合了一些多态。我无法通过引用shared_ptr将派生的obj传递给期望shared_ptr到基类的函数。我把它煮成了一个非常小的片段,暴露了让我困惑的行为。

#include <boost/shared_ptr.hpp>

class Base
{
};

class Derived : public Base
{
};

int main()
{
  boost::shared_ptr<Derived> pDerived(new Derived());  // simple creation
  boost::shared_ptr<Derived> &alias1 = pDerived;       // works fine
  const boost::shared_ptr<Base> &alias2 = pDerived;    // also works fine
  boost::shared_ptr<Base> &alias3 = pDerived;          // compilation error

  //native pointers
  Derived *alias4 = pDerived.get();     //works
  const Base *alias5 = pDerived.get();  //works
  Base *alias6 = pDerived.get();        //works

  //native references
  Derived &alias7 = *pDerived;          // works
  const Base &alias8 = *pDerived;       // works
  Base &alias9 = *pDerived;             // works
}

我不明白为什么alias2的赋值完全正常,但alias3的赋值会产生编译错误。有人可以解释一下吗?我需要像alias3这样的功能,并且无法使其正常工作。

1 个答案:

答案 0 :(得分:0)

此问题与提升或智能指针无关。它也可能发生在POD类型中,如下面的简单示例所示:

int main() {
    int x = 0;
    const double &y = x; //fine
    double &z = x; //error!
    return 0;
}

原因是临时值(rvalue)可以绑定到const&,但它不能绑定到&double &z = x中发生的情况是xz是不相关的类型,x需要转换为double并创建临时变量,无法绑定到&