超级SCARY迭代器合法吗
Are super-SCARY iterators legal?
我知道标准允许std::vector<int, A>
为不同的分配器A
具有相同类型的迭代器。这被称为SCARY迭代器。
现在的问题是,标准是否允许std::vector<int, A>::iterator
只是A::pointer
的typedef,从而使其成为默认分配器的int*
?
或者是否有某种(隐含的)要求它是每个容器的一个单独的类类型?如果没有这样的要求,那么为什么所有主要的实现(包括可怕的实现)都不使用这种方法?这可能会进一步减少编译器的工作,尽管现在int*
和vector<>::iterator
上重载的代码将不会编译。
Re
"标准是否允许
std::vector<int, A>::iterator
只是A::pointer
的typedef
据我所知,是的。但不是std::vector<bool, A>
,因为这是一种特殊化,其中去引用迭代器是一个访问所使用的任何表示的代理对象,目的是支持每个bool
一位。
现在的问题是,标准是否允许
std::vector<int, A>::iterator
只是A::pointer
的typedef,从而使其成为默认分配器的int*
?
我认为,不仅仅是在任何实施上。
24.2迭代器要求[Iterator.requestions]
24.2.1一般情况[iterator.requestions.general]
11在以下部分中,
a
和b
表示X
或const X
类型的值,[…]24.2.7随机访问迭代器[Random.access.iterators]
表达式|返回类型|可操作|断言/注释||语义|前置/后置条件-----------+----------------+-------------+--------------------------------[…]-----------+----------------+-------------+--------------------------------a<b|上下文|b-a>0|<是一个总排序关系|可转换为|||bool||
请注意,与-
的早期要求不同,<
不存在a
和b
是同一容器的迭代器的前提条件。CCD_ 23是形成任意迭代器的总排序关系所必需的。CCD_ 24不需要形成任意指针的总排序关系。虽然允许实现扩展原始指针类型的<
的定义,以允许比较不相关的指针值,但当前流行的现实世界实现不这样做,因为这样的扩展会阻止一些优化机会。
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 如何在c++迭代器类型中包装std::chrono
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 对于set上的循环-获取next元素迭代器
- 为什么output_editor Concept不需要output_e迭代器标记
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 使用迭代器时如何访问对象在向量中的位置?
- std::vector::迭代器是否可以合法地作为指针
- 跟随整数索引列表的自定义类迭代器
- 不明白迭代器,引用和指针失效,一个例子
- 我可以使用反向迭代器作为ForwardIt吗
- ESP8266单片机矢量迭代器的C++问题
- 如何在C++中将迭代器作为函数参数传递
- 是否应避免从非常量迭代器转换为常量迭代器?
- 如何在 c++ 中将字符串迭代器变量传递给函数?
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 超级SCARY迭代器合法吗