dynamic_cast和rvalue引用

Ser*_*uin 15 c++ dynamic-cast rvalue language-lawyer c++11

class A{
public:
    virtual ~A() {};
};

class B : public A{ };

int main(){

    A&& p = B();

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

}
Run Code Online (Sandbox Code Playgroud)

抛出错误(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]
Run Code Online (Sandbox Code Playgroud)

它试图转换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应该是指向完成类类型的指针的prvalue,结果是类型T的prvalue.如果T是左值引用类型,则v应该是完整类类型的左值,并且结果是由T 引用的类型的左值.如果T是右值引用类型,则v应该是具有完整类类型的表达式,并且结果是由T引用的类型的x值.

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

Col*_*mbo 7

你的代码当然没问题:

如果T是右值引用类型,则v应该是具有完整类类型的表达式,并且结果是由引用的类型的xvalue T.

据推测,dynamic_cast在引入右值引用时没有正确更新,并且仍然强制执行前C++ 11规则,即rvalues只能绑定到const左值引用(请注意,在更改目标类型时它甚至不起作用B const&&,尽管错误消息暗示的那些!).

归档为#69390.