2016-01-20 74 views
14
class A{ 
public: 
    virtual ~A() {}; 
}; 

class B : public A{ }; 

int main(){ 

    A&& p = B(); 

    dynamic_cast<B&&>(std::move(p)); 

} 

抛出的误差(克++ 5.2.0):的dynamic_cast和右值参考

error: conversion to non-const reference type 'std::remove_reference<A&>::type& {aka class A&}' from rvalue of type 'A' [-fpermissive] 

它试图投std::move(p)键入A&,但我不能找出原因。我认为有必要在转换为右值引用之前将p作为右值,但是如果我删除了std::move,则编译得很好。从cppreference

dynamic_cast <new_type> (expression)

到其他转换表达式类似的,其结果是:

如果NEW_TYPE是一个左值引用类型左值(表达式必须是一个左值)

的x值如果new_type是右参考类型(表达式可能是左值或右值

即使N3337的5.2.7:

dynamic_cast<T>(v)

如果T是一个指针型,V应的指针的prvalue完成类型,其结果是类型T的prvalue 。如果T是一个左值引用类型,v应该是一个完整类类型的左值,并且结果是由T引用的类型的左值。如果T是右值引用类型,则v应该是具有完整的类类型,结果是T所指类型的xvalue。

唯一的要求是我使用完整的类类型,其中std::move(p)是,不是吗?

+1

铿锵与您的代码没有问题 – Cubbi

+0

与海湾合作委员会5.3确认。尽管没有'std :: move'调用。 ;) – erip

+0

...正如你在你的问题中指出的那样。我应该更彻底地阅读问题。 – erip

回答

6

您的代码,当然,精:

如果T是一个rvalue引用类型,v应具有 完整的类类型的表达式,并且结果是该类型的x值称为 到T

据推测,dynamic_cast没有更新的情况下正确右值引用进行了介绍,并且仍然强制执行右值应仅结合const左值引用(请注意,它甚至不工作预C++ 11的规则当将目标类型更改为B const&&时,尽管错误消息暗示了这一点!)。

提起为#69390

2

这似乎不是工作:

B&& b = std::move(dynamic_cast<B&>(p)); 

不能告诉你为什么你不正确。