我有一个事物的迭代器。如果我想将当前项目转换为指向该项目的指针,为什么这样做:
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> > >
答案 0 :(得分:11)
在
&(*it);
*
重载以执行逻辑上的操作:将迭代器类型转换为其指向的对象。然后,您可以安全地获取此对象的地址。
而在
reinterpret_cast<Thing*>(it);
您告诉编译器将it
对象重新解释为指针。但它可能根本不是一个指针 - 它可能是一个50字节的结构,对于你所知道的一切!在这种情况下,它的第一个sizeof (Thing*)
字节绝对不会指向任何合理的。
提示:reinterpret_cast<>
几乎总是错误的。
答案 1 :(得分:4)
义务标准行情,强调我的:
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)
*
运算符被重载并且返回了一个
引用它指向的对象。thing_pointer = *(reinterpret_cast<Thing**>(&it));
强制它。但这是未定义的行为。答案 3 :(得分:2)
因为迭代器不是指针。它是一类实现定义的结构,如果你试图将它重新解释为一个指针,迭代器类的原始数据将被视为一个内存指针,可能,但可能不会指向有效的内存
答案 4 :(得分:2)
第一个获取对象的引用,然后获取它的地址,给出指针。
第二个尝试将迭代器强制转换为指针,这可能会失败,因为大多数类型都不能转换为指针 - 只有其他指针,整数和具有转换运算符的类类型。