C++:切片到rvalue基础?

Jul*_*n__ 1 c++ rvalue-reference c++11

我遇到了以下代码,我在谷歌上找不到为什么以下语句是有效的C++:

Base&& b = Derived();
Run Code Online (Sandbox Code Playgroud)

请解释或参考

这是一个示例代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

印刷品:

hi derived
Run Code Online (Sandbox Code Playgroud)

jag*_*ire 8

这是临时绑定到r值引用.临时值可以绑定到常量l值引用和r值引用.

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

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

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

...

callHi(Derived{}); // ultimately calls derived say_hi method
Run Code Online (Sandbox Code Playgroud)

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

  • 参考文献是简明扼要的参考文献.+1 (3认同)