boost :: scoped_ptr转换为引用失败

时间:2014-06-02 15:09:32

标签: c++ boost smart-pointers

有人可以解释为什么在此示例中转换为引用类型失败了吗? 我想使用boost::scoped_ptr作为缺少std::unique_ptr的解决方法。

struct A{};

struct B
{
    B(boost::scoped_ptr<A>& a) { m_a.swap(a); }
    boost::scoped_ptr<A> m_a;
};

void f()
{
    B b(boost::scoped_ptr<A>(new A));
}

gcc失败了:

note:   no known conversion for argument 1 from ‘boost::scoped_ptr<A>’ 
to ‘boost::scoped_ptr<A>&’

设计原理(为什么首先使用scoped_ptr):

  • 因为异常安全而不想使用原始指针(真实场景涉及多个对象要传递)
  • 由于可能的静默解除分配失败,不想使用auto_ptr
  • 不能使用unique_ptr,因为仍然坚持使用C ++ 03
  • 使用shared_ptr可能是有效的解决方法但看起来不干净,因为没有共享,真的

1 个答案:

答案 0 :(得分:4)

你不能像在这里那样将非常量左值引用绑定到临时值

B b(boost::scoped_ptr<A>(new A));

您可以通过传递左值来解决该特定问题:

void f()
{   
    boost::scoped_ptr<A> a(new A);
    B b(a);
}