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)不是吗?
| 归档时间: |
|
| 查看次数: |
1017 次 |
| 最近记录: |