C++:切片到基本右值?

C++ : Slicing to base rvalue?

我遇到了以下代码,但在 google 上找不到为什么以下语句对 C++ 有效:

Base&& b = Derived();

请说明或参考

这是一个示例代码:

#include <iostream>
using namespace std;

class Base{
public:
    virtual ~Base(){}
    virtual void say_hi() { cout << "hi base"; }
};
class Derived : public Base{
public:
    virtual ~Derived(){}
    virtual void say_hi() { cout << "hi derived"; }
};

int main(int argc, const char * argv[]) {
    Base&& b = Derived();
    b.say_hi();

    return 0;
}

打印:

hi derived

这是将临时文件绑定到 r-value 引用。临时对象可以绑定到常量 l-value 引用和 r-value 引用。

至于为什么正确调用派生函数,那是因为你调用的是虚函数。动态调度正常进行。

这与使用带有 r-value 参考参数的函数调用有点相同:

void callHi(Base&& b){
  b.say_hi();
}

...

callHi(Derived{}); // ultimately calls derived say_hi method

你提到切片。要进行切片,the sequence of events is a bit more complex than simply calling a virtual function.