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

How do I construct a base class which receives a reference argument?

本文关键字:引用 参数 基类 一个 何构造      更新时间:2023-10-16

我无法使用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时,我该怎么做?

如果您只能更改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);
    }
};

问题是试图将非常数引用绑定到GetA返回的临时引用。如果你可以先把它分配给一个变量,你就有了一个左值,它可以正常工作

正如Alex B

所说(删除答案),如果您可以更改B,那么最好按值取auto_ptr参数;若可以更改编译器,那个么最好使用unique_ptr并移动语义。

取决于B如何处理传入的引用。

  • 如果B要复制该参数,则将该参数设为const&
  • 如果B将持有对参数的引用,那么您需要传入的任何内容都比B的实例化具有更长的生存期。(如前所述,通过调用GetA()创建的临时对象没有。)