【问题标题】:dynamic_cast and rvalue referencedynamic_cast 和右值引用
【发布时间】: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&amp;,但我不知道为什么。我认为有必要在转换为右值引用之前将p 转换为右值,但如果我删除std::move 它编译得很好。来自cppreference

dynamic_cast &lt; new_type &gt; ( expression )

与其他强制转换表达式类似,结果是:

如果 new_type 是左值引用类型,则为左值(表达式必须是左值)

如果 new_type 是右值引用类型,则为 xvalue(表达式可以是左值或右值

N3337 偶数 5.2.7:

dynamic_cast&lt;T&gt;(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


【解决方案1】:

这似乎可行:

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

无法告诉你为什么你的不正确。

【讨论】:

    【解决方案2】:

    你的代码当然没问题:

    如果T 是右值引用类型,v 应为具有 完整的类类型,结果是引用类型的 xvalue 发给T

    大概,dynamic_cast 在引入右值引用时没有正确更新,并且仍然强制执行 C++11 之前的规则,即右值只能绑定到 const 左值引用(请注意,它甚至没有在将目标类型更改为B const&amp;&amp; 时工作,尽管错误消息暗示了这一点!)。

    归档为#69390

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      • 2016-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-10
      • 1970-01-01
      相关资源
      最近更新 更多