如何构造一个接收引用参数的基类
How do I construct a base class which receives a reference argument?
我无法使用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
auto_ptr
参数;若可以更改编译器,那个么最好使用unique_ptr
并移动语义。
取决于B如何处理传入的引用。
- 如果B要复制该参数,则将该参数设为const&
- 如果B将持有对参数的引用,那么您需要传入的任何内容都比B的实例化具有更长的生存期。(如前所述,通过调用GetA()创建的临时对象没有。)
相关文章:
- 将const引用参数初始化为默认参数会导致悬空引用吗
- 具有常量引用参数的函数模板专用化
- C++:常量引用参数
- 字符串引用参数的效率C++
- 通过非常量引用参数修改常量引用参数
- 如何将指针变量作为引用参数传递?
- C++初始化 std::function 时如何将占位符绑定到引用/引用参数?
- 移动类的成员作为常量引用参数传递
- C++带有适用于左值和右值的引用参数的函数
- constexpr 函数的常量引用参数:gcc/msvc vs clang/icc
- 如何使用类型特征将函数的通用引用参数限制为 r 值引用?
- 委托构造函数和引用参数
- 对 const 引用参数使用默认值会导致崩溃
- 为什么我们不允许将纯引用参数传递给 std::thread,但允许传递原始指针?
- 为什么我需要将默认引用参数定义为 const 以便为其分配一个左值?
- 将非左值作为常量引用参数传递.临时是在本地作用域还是在调用方作用域中创建的?
- 如何强制函数仅接受左值引用参数
- 模板引用参数推断失败C++
- 非类型引用参数可以在运行时修改,这是否意味着模板可以在运行时实例化?
- 将unique_ptr作为引用参数或常量传递unique_ptr引用