我需要优化一小段代码。线程' 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这样的功能,并且无法使其正常工作。
答案 0 :(得分:0)
此问题与提升或智能指针无关。它也可能发生在POD类型中,如下面的简单示例所示:
int main() {
int x = 0;
const double &y = x; //fine
double &z = x; //error!
return 0;
}
原因是临时值(rvalue)可以绑定到const&
,但它不能绑定到&
。 double &z = x
中发生的情况是x
和z
是不相关的类型,x
需要转换为double
并创建临时变量,无法绑定到&
。