reinterpret_cast指向指针的迭代器

时间:2013-10-24 15:12:14

标签: c++ iterator reinterpret-cast

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

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

5 个答案:

答案 0 :(得分:11)

&(*it);

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

而在

reinterpret_cast<Thing*>(it);

您告诉编译器将it对象重新解释为指针。但它可能根本不是一个指针 - 它可能是一个50字节的结构,对于你所知道的一切!在这种情况下,它的第一个sizeof (Thing*)字节绝对不会指向任何合理的。

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

答案 1 :(得分:4)

义务标准行情,强调我的:

5.2.19重新解释演员

  

1 / [...]可以使用明确执行的转换   reinterpret_cast列在下面。 没有其他转换可以   使用reinterpret_cast明确执行。

     

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

     

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不是指针,而是一个对象。事实上,这个对象被设计为以多种方式模拟指针,但它仍然不是指针。

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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

答案 4 :(得分:2)

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

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