如何构造一个接收引用参数的基类?

时间:2012-02-07 11:44:08

标签: c++ inheritance g++ base rvalue

我无法使用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,我怎能这样做?

2 个答案:

答案 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对传入的参考文献的作用。

  • 如果B要获取参数的副本,则将参数设为const&amp;
  • 如果B将持有对参数的引用,那么您需要传入的任何内容的生命周期都比B的实例化更长。(如前所述,通过调用GetA()创建的临时值不会。)