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> > >
in
&(*it);
*
已重载以执行您的逻辑含义:将迭代器类型转换为其指向的对象。 然后,您可以安全地获取此对象的地址。
而在
reinterpret_cast<Thing*>(it);
您告诉编译器从字面上将it
对象重新解释为指针。 但它可能根本不是一个指针 - 它可能是一个 50 字节的结构,据你所知! 在这种情况下,它的前 sizeof (Thing*)
个字节绝对不会碰巧指向任何明智的东西。
提示:reinterpret_cast<>
几乎总是错误的事情。
强制性标准引号,强调我的:
5.2.19 重新诠释演员表
1/[...] 可以使用以下方法显式执行的转换 下面列出了reinterpret_cast。没有其他转换可以 使用 reinterpret_cast 显式执行。
4/指针可以显式转换为任何整数类型 large 足以容纳它。[...]
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
不是指针,而是对象。 碰巧的是,这个对象被设计为以多种方式模拟指针,但它仍然不是指针。
- 因为迭代器的运算符
*
重载并且返回引用它指向的对象。 - 您可以通过
thing_pointer = *(reinterpret_cast<Thing**>(&it));
强制执行。但这是未定义的行为。
因为迭代器不是指针。它是一类实现定义的结构,如果你尝试将其重新解释为指针,迭代器类的原始数据将被视为内存指针,它可能,但可能不会指向有效内存
第一个获取对对象的引用,然后获取对象的地址,给出指针。
第二个尝试将迭代器强制转换为指针,这很可能会失败,因为大多数类型不能强制转换为指针 - 只能强制转换为具有转换运算符的其他指针、整数和类类型。
- std::vector::迭代器是否可以合法地作为指针
- 不明白迭代器,引用和指针失效,一个例子
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 在C++中释放内存期间,迭代器与指针有何不同
- 迭代器的指针操作问题
- 对于随机访问迭代器(矢量迭代器),迭代器C++样式指针吗?
- 专门C++使用指针值类型的通用迭代器的模板函数?
- 从 std::vector 迭代器中执行函数指针
- 使用 map<char,strring> 的迭代器返回指针 map<char,strring>*
- 迭代器是否分配内存(如指针)?
- 如何在C++中重新实现包含指针的 STL 容器的类的迭代器
- 向量<pointer>:插入(迭代器,指针)插入垃圾值
- 迭代器可以变成指针吗?
- 用于 STL 迭代器、指针和 std::nullptr_t 的模板函数
- 如果我有一个指向矢量元素的指针,而不是迭代器,如何删除它?
- 将列表 en 列表迭代器作为指针 C++ 传递
- 将unordered_map元素指向指针/迭代器
- 如何制作指针迭代器
- 如何在C++中存储对 stl 容器元素的指针/迭代器引用
- STL容器迭代器和C指针迭代器之间的区别是什么