我无法使用g ++ 4.1.2编译以下代码:
#include <memory>
class A
{
public:
};
std::auto_ptr<A> GetA()
{
return std::auto_ptr<A>(new A);
}
class B
{
B(std::auto_ptr<A>& pA)
{
}
};
class C : public B
{
C() : B(GetA())
{
}
};
我明白了:
将
std::auto_ptr<A>
类型的右值表达式无效转换为类型std::auto_ptr<A>&
问题是我无法定义变量并传递其引用,因为我在初始化列表中。
如果我只允许更改课程C
,我怎能这样做?
答案 0 :(得分:3)
如果您只能 更改C,则可以执行以下操作:
class C: public B
{
explicit C(std::auto_ptr<A>& pA) : B(pA) {}
public:
static C *GetC()
{
std::auto_ptr<A> pA = GetA();
return new C(pA);
}
};
问题是尝试将非const引用绑定到GetA
返回的临时引用。如果你可以先将它分配给一个变量,你就有一个左值,它可以正常工作。
正如Alex B 所说所说的(删除的答案),如果你可以改变B,那么最好按值auto_ptr
参数;如果你可以改变编译器,最好使用unique_ptr
并移动语义。
答案 1 :(得分:0)
取决于B对传入的参考文献的作用。