【发布时间】:2016-04-26 08:44:53
【问题描述】:
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 转换为右值,但如果我删除std::move 它编译得很好。来自cppreference:
dynamic_cast < new_type > ( expression )与其他强制转换表达式类似,结果是:
如果 new_type 是左值引用类型,则为左值(表达式必须是左值)
如果 new_type 是右值引用类型,则为 xvalue(表达式可以是左值或右值)
N3337 偶数 5.2.7:
dynamic_cast<T>(v)如果 T 是指针类型,v 应该是指向完整类类型的指针的纯右值,结果是 T 类型的纯右值。如果 T 是左值引用类型,v 应该是完整类的左值类型,结果是 T 所指类型的左值。 如果 T 是右值引用类型,则 v 应为具有完整类类型的表达式,结果是T。
唯一的要求是我使用完整的类类型,std::move(p) 是,不是吗?
【问题讨论】:
-
Clang 你的代码没有问题
-
已通过 gcc 5.3 确认。不过,无需
std::move调用即可工作。 ;) -
...正如您在问题中指出的那样。我应该更彻底地阅读问题。
标签: c++ c++11 language-lawyer dynamic-cast rvalue