超级SCARY迭代器合法吗

Are super-SCARY iterators legal?

本文关键字:迭代器 SCARY 超级      更新时间:2023-10-16

我知道标准允许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在以下部分中,ab表示Xconst X类型的值,[…]

24.2.7随机访问迭代器[Random.access.iterators]

表达式|返回类型|可操作|断言/注释||语义|前置/后置条件-----------+----------------+-------------+--------------------------------[…]-----------+----------------+-------------+--------------------------------a<b|上下文|b-a>0|<是一个总排序关系|可转换为|||bool||

请注意,与-的早期要求不同,<不存在ab是同一容器的迭代器的前提条件。CCD_ 23是形成任意迭代器的总排序关系所必需的。CCD_ 24不需要形成任意指针的总排序关系。虽然允许实现扩展原始指针类型的<的定义,以允许比较不相关的指针值,但当前流行的现实世界实现不这样做,因为这样的扩展会阻止一些优化机会。