[英]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<>
几乎总是错误的。
义务标准行情,强调我的:
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
不是指针 ,而是对象。 事实上,这个对象被设计为以多种方式模拟指针,但它仍然不是指针。
*
运算符被重载并且它返回对它所指向的对象的引用。 thing_pointer = *(reinterpret_cast<Thing**>(&it));
强制它thing_pointer = *(reinterpret_cast<Thing**>(&it));
。 但这是未定义的行为。 因为迭代器不是指针。 它是一类实现定义的结构,如果你试图将它重新解释为一个指针,迭代器类的原始数据将被视为一个内存指针,它可能,但可能不会指向有效的内存
第一个获取对象的引用,然后获取它的地址,给出指针。
第二个尝试将迭代器强制转换为指针,这可能会失败,因为大多数类型都不能转换为指针 - 只有其他指针,整数和具有转换运算符的类类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.