温馨提示:本文翻译自stackoverflow.com,查看原文请点击:c++ - rvalue reference and polymorphism
c++ virtual-functions rvalue-reference object-lifetime temporary-objects

c++ - 右值参考和多态性

发布于 2020-03-27 11:47:54

当我运行以下代码时,出现以下运行时崩溃:

“称为虚拟方法的纯虚拟方法,在没有活动异常的情况下终止”

我不明白为什么多态在这里不起作用。请有人帮我。

struct Base
{
    virtual void print()=0;
    virtual ~Base(){}
};

struct Derived: public Base
{
    void print(){cout << "this is Derived\n";}
};

struct Foo
{
    Foo(Base&& r): bref{r} {}
    void print(){
        bref.print();
    }
    Base& bref;
};

int main()
{
    Foo f{Derived()};
    f.print(); //it crashes here with above message
}

查看更多

查看更多

提问者
Carlosio
被浏览
16
eerorika 2019-07-03 23:16

临时对象的生存期Derived()一直延长到完整表达式为为止Foo f{Derived()};f.bref在那之后是一个悬而未决的参考。具有不确定行为的f.print()呼叫bref.print()

Foo{Derived()}.print(); 从技术上讲,它是很好定义的,但是将左值引用存储到传递给构造函数的右值引用对象中可能没有任何意义。