动态转换引用和自动

6 c++ dynamic-cast reference auto c++11

使用auto和dynamic_cast时,我遇到了一个非常奇怪的行为.这是我有的课程:

class BaseInterface {
public:
    virtual void someMethod()=0;
};

class Derived:public BaseInterface {
public:
    virtual void someMethod1()=0;
    void someMethod()override;
};
Run Code Online (Sandbox Code Playgroud)

当然,有一些类实现了所有派生方法.

然后有第三个类看起来像这样:

class ThirdClass {
public:
    void demoMethod(BaseInterface&);
    void anotherMethod(Derived&);
};

void ThirdClass::demoMethod(BaseInterface& obj) {
    auto buffer=dynamic_cast<Derived&>(obj);
    anotherMethod(buffer);
}
Run Code Online (Sandbox Code Playgroud)

当我用gcc编译它时,我得到一个"无法分配抽象类型的对象"错误.而当我更换

auto buffer=...
Run Code Online (Sandbox Code Playgroud)

Derived& buffer=...
Run Code Online (Sandbox Code Playgroud)

一切都很好.为什么会这样?自动没有推断出正确的类型或什么?

我还发现了一个仍然使用auto的肮脏技巧:

void ThirdClass::demoMethod(Base& obj) {
    auto buffer=dynamic_cast<Derived*>(&obj);
    anotherMethod(*buffer);
}
Run Code Online (Sandbox Code Playgroud)

Bil*_*nch 6

Derived来自auto.请改用:

auto & buffer = dynamic_cast<Derived&>(obj);
Run Code Online (Sandbox Code Playgroud)