C++ : 切片至基值

C++ : Slicing to base rvalue?

本文关键字:切片 C++      更新时间:2023-10-16

我遇到了以下代码,但我在谷歌上找不到为什么以下语句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 值引用。临时变量可以绑定到常量 l 值引用和 r 值引用。

至于为什么它正确地调用派生函数,那是因为你在调用一个虚函数。动态调度照常进行。

这与使用带有 r 值引用参数的函数调用相同:

void callHi(Base&& b){
  b.say_hi();
}
...
callHi(Derived{}); // ultimately calls derived say_hi method

你提到切片。为了进行切片,事件的顺序比简单地调用虚函数要复杂一些。