4

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

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> > >

4

5 回答 5

11

&(*it);

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

而在

reinterpret_cast<Thing*>(it);

您是在告诉编译器将it对象重新解释为指针。但它可能根本不是一个指针——它可能是一个 50 字节的结构,就你所知!在那种情况下,它的第一个sizeof (Thing*)字节绝对不会碰巧指向任何有意义的东西。

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

于 2013-10-24T15:16:20.923 回答
4

强制性标准报价,强调我的:

5.2.19 重新解释演员表

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

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

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

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

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

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

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

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

11/ 如果可以使用 reinterpret_cast 将“指向 T1 的指针”类型的表达式显式转换为“指向 T2 的指针”类型,则可以将 [...] T1 强制转换为类型“对 T2 的引用”。[...]

除了 4/、5/ 和 11/ 中提到的整数到指针和值到引用的转换之外,唯一可以使用的转换reinterpret_cast是指针到指针的转换。

然而在:

thing_pointer = reinterpret_cast<Thing*>(it);

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

于 2013-10-24T15:32:06.890 回答
2
  1. 因为*迭代器的操作符被重载,它返回一个指向它所指向的对象的引用。
  2. 你可以通过thing_pointer = *(reinterpret_cast<Thing**>(&it));. 但这是未定义的行为。
于 2013-10-24T15:14:52.903 回答
2

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

于 2013-10-24T15:15:03.660 回答
2

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

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

于 2013-10-24T15:17:55.850 回答