gpt4 book ai didi

C++ : Slicing to base rvalue?

转载 作者:太空宇宙 更新时间:2023-11-03 10:26:03 26 4
gpt4 key购买 nike

我遇到了下面的代码,但我在谷歌上找不到为什么下面的语句是有效的 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

最佳答案

这是将临时值绑定(bind)到右值引用。临时对象可以绑定(bind)到常量左值引用和右值引用。

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

这有点像使用带有右值引用参数的函数调用:

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.

关于C++ : Slicing to base rvalue?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34903920/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com