繁体   English   中英

reinterpret_cast指向指针的迭代器

[英]reinterpret_cast an iterator to a pointer

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

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

&(*it);

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

而在

reinterpret_cast<Thing*>(it);

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

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

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

5.2.19重新解释演员表

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

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

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

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

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

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

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

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

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

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

但是在:

thing_pointer = reinterpret_cast<Thing*>(it);

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM