通过引用创建别名以提升:shared_ptr

Create aliases to boost::shared_ptr via reference

本文关键字:shared ptr 引用 创建 别名      更新时间:2023-10-16

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

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

所描述的一切都很好,直到我加入了一点多态性。我不能通过引用将shared_ptr传递给派生的obj,传递给期望将shared_pt传递给基类的函数。我把这归结为一个非常小的片段,暴露了让我困惑的行为

#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示例那样的功能,但无法使其正常工作。

这个问题与boost或智能指针无关。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并创建一个临时变量,该临时变量无法绑定到&