reinterpret_cast指向指针的迭代器

reinterpret_cast an iterator to a pointer

本文关键字:指针 迭代器 cast reinterpret      更新时间:2023-10-16

我有一个事物的迭代器。如果我想将当前项目转换为指向该项目的指针,为什么这样做:

thing_pointer = &(*it);

但这不是:

thing_pointer = reinterpret_cast<Thing*>(it);

这是我试图理解的编译器错误:http://msdn.microsoft.com/en-us/library/sy5tsf8z(v=vs.90).aspx

以防万一,迭代器的类型std::_Vector_iterator<std::_Vector_val<Thing,std::allocator<Thing> > >

in

&(*it);

*重载以执行您的逻辑含义:将迭代器类型转换为其指向的对象。 然后,您可以安全地获取此对象的地址。

而在

reinterpret_cast<Thing*>(it);

您告诉编译器从字面上将it对象重新解释为指针。 但它可能根本不是一个指针 - 它可能是一个 50 字节的结构,据你所知! 在这种情况下,它的前 sizeof (Thing*) 个字节绝对不会碰巧指向任何明智的东西。

提示:reinterpret_cast<>几乎总是错误的事情。

强制性标准引号,强调我的:

5.2.19 重新诠释演员表

1/[...] 可以使用以下方法显式执行的转换 下面列出了reinterpret_cast。没有其他转换可以 使用 reinterpret_cast 显式执行。

4/指针可以显式转换为任何整数类型 large 足以容纳它。[...]

5/可以显式使用整型或枚举型的值 转换为指针。[...]

6/函数指针可以显式转换为函数 不同类型的指针。[...]

7/对象指针可以显式转换为对象指针 不同类型的。[...]

8/将函数指针转换为对象指针类型或副指针 反之亦然,有条件地支持。[...]

9/空指针值 (4.10) 转换为空指针 目标类型的值。[...]

10/[...]"指向类型 T1 的 X 的成员的指针"可以显式 转换为 [...]"指向类型 T2 的 Y 成员的指针" [...]

11/A [...]T1 可以转换为类型"对 T2 的引用",如果 类型为"指向 T1 的指针"的表达式可以显式转换为 使用reinterpret_cast键入"指向 T2 的指针"。[...]

除了 4/、5/和 11/中提到的积分到指针和值到参考的转换外,可以使用reinterpret_cast执行的唯一转换是指针到指针的转换。

但是在:

thing_pointer = reinterpret_cast<Thing*>(it);

it不是指针,而是对象。 碰巧的是,这个对象被设计为以多种方式模拟指针,但它仍然不是指针。

  1. 因为迭代器的运算符*重载并且返回引用它指向的对象。
  2. 您可以通过thing_pointer = *(reinterpret_cast<Thing**>(&it));强制执行。但这是未定义的行为。

因为迭代器不是指针。它是一类实现定义的结构,如果你尝试将其重新解释为指针,迭代器类的原始数据将被视为内存指针,它可能,但可能不会指向有效内存

第一个获取对对象的引用,然后获取对象的地址,给出指针。

第二个尝试将迭代器强制转换为指针,这很可能会失败,因为大多数类型不能强制转换为指针 - 只能强制转换为具有转换运算符的其他指针、整数和类类型。