【问题标题】:static_cast and reference to pointersstatic_cast 和对指针的引用
【发布时间】:2013-01-17 15:44:04
【问题描述】:

谁能告诉我为什么这不能编译:

struct A { };
struct B : public A { };

int main()
{
  B b;
  A* a = &b;
  B* &b1 = static_cast<B*&>(a);
  return 0;
}

现在,如果您将静态转换替换为:

B* b1 = static_cast<B*>(a);

然后它会编译。

编辑: 很明显,编译器将A*B* 视为独立类型,否则这将起作用。问题更多的是为什么这是可取的?

【问题讨论】:

  • a 不是对指针的引用,而是指针。
  • @MrLister B*&amp; 是对指向B 的指针的引用。
  • 仅供参考,dynamic_cast 会更安全
  • @user814628 仅当您不知道(由于程序逻辑)强制转换是有效的,并且使用dynamic_cast 强制编译器将运行时类型信息嵌入到该类层次结构中。将此与 dynamic_cast 的相对较慢的操作相结合,这是一个除非必要,否则您不想使用的解决方案。
  • @user814628 dynamic_cast 在这里是不合法的。

标签: c++ pointers reference const-cast


【解决方案1】:

B 派生自 A,但 B* 并非派生自 A*。 指向B 的指针不是指向A 的指针,它只能是 转换为一个。但是类型仍然不同(并且 转换可以而且经常会改变 指针)。 B*&amp; 只能引用 B*,不能引用任何其他 指针类型。

【讨论】:

    【解决方案2】:

    非常量左值引用 (B*&) 不能绑定到 不相关 类型 (A*)。

    【讨论】:

      【解决方案3】:

      您正在尝试将 A* 转换为 B*。这是错误的方法,不是很有用。您可能希望将派生的指针存储在指向基址的指针中,这很有用,甚至不需要强制转换。

      我想dynamic_cast 可能在这里工作,但如果我没记错的话,结果是实现定义的。

      【讨论】:

      • 您不能使用dynamic_castA* 转换为B*&amp;。这是不合法的,代码不会编译。
      • A* 转换到B*static_cast 有意义的唯一方向。在另一个方向,没有什么可做的。
      【解决方案4】:

      引用的处理是编译器为你做的事情,应该不需要强制转换为引用。

      如果我们将代码重构为:

      B b;
      A* a = &b;
      B* b_ptr = static_cast<B*>(a);
      B*& p1 = b_ptr;
      

      它会编译。

      【讨论】:

      • 我同意(见我的帖子),但这不一样。例如,更改p1 中的指针不会更改a 中的指针。
      猜你喜欢
      • 2017-11-30
      • 2021-08-06
      • 2018-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-26
      • 2021-09-09
      • 2023-04-10
      相关资源
      最近更新 更多