2016-01-20 54 views
0

我碰到下面的代码,我不能对谷歌发现,为什么下面的语句是有效的C++: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 
+0

你能理解为什么'派生d; Base&b = d;'会有效吗?如果是这样,你可以[编辑]你的问题来解释你觉得区别在哪里? – Angew

回答

7

这是双向找到一个临时的r值参考。临时可能会被绑定到常量l值引用和r值引用。

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

这有点像使用一个函数调用的r值参考参数:

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.

+3

参考文献是参考文献,简单明了。 +1 – erip

+0

@erip:感谢您的评论,它有帮助! –