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)
是,不是吗?
铿锵与您的代码没有问题 – Cubbi
与海湾合作委员会5.3确认。尽管没有'std :: move'调用。 ;) – erip
...正如你在你的问题中指出的那样。我应该更彻底地阅读问题。 – erip