class A{
public:
virtual ~A() {};
};
class B : public A{ };
int main(){
A&& p = B();
dynamic_cast<B&&>(std::move(p));
}
抛出错误(g++ 5.2.0):
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
强制转换为 rvalue,但如果我删除 std::move
,它就可以编译通过。来自 cppreference 的内容如下:
即使是 N3337 的 5.2.7:
dynamic_cast < new_type > ( expression )
与其他强制转换表达式类似,其结果为:
如果 new_type 是左值引用类型,则为左值(expression 必须是左值)
如果 new_type 是右值引用类型,则为 xvalue(expression 可以是左值或右值)
dynamic_cast<T>(v)
如果 T 是指针类型,则 v 必须是指向完整类类型的 prvalue 指针,结果是类型为 T 的 prvalue。如果 T 是左值引用类型,则 v 必须是完整类类型的左值,结果是 T 所引用类型的左值。如果 T 是右值引用类型,则 v 必须是具有完整类类型的表达式,结果是 T 所引用类型的 xvalue。
那里唯一的要求是我使用完整类类型,std::move(p)
就是完整类类型,不是吗?
std::move
调用也可以工作。;) - erip