超级SCARY迭代器是否合法?

时间:2016-07-19 21:13:21

标签: c++ language-lawyer

我理解标准允许std::vector<int, A>为不同的分配器A提供相同类型的迭代器。这称为SCARY iterators

现在问题是标准允许std::vector<int, A>::iterator只是A::pointer的typedef,因此它只是默认分配器的int*

或者是否有一些(隐含的)要求它是每个容器的单独类类型?如果没有这样的要求那么为什么所有主要实现(包括SCARY)都不使用这种方法?它可能会进一步减少编译器工作,但现在int*vector<>::iterator上的重载代码将无法编译。

2 个答案:

答案 0 :(得分:7)

RE

  

标准允许std::vector<int, A>::iterator只是A::pointer

的typedef

据我所知,是的。但不是std::vector<bool, A>,因为这是一个特殊化,其中解除引用的迭代器是一个代理对象,它访问所使用的任何表示,目的是每bool支持一位。

答案 1 :(得分:5)

  

现在问题是标准允许std::vector<int, A>::iterator只是A::pointer的typedef,从而使它只是默认分配器的int*吗?

我认为不是任何实施。

  

24.2迭代器要求[iterator.requirements]

     

24.2.1一般[iterator.requirements.general]

     

11在以下各节中,ab表示Xconst X类型的值,[...]

     

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

Expression | Return type    | Operational | Assertion/note
           |                | semantics   | pre-/post-condition
-----------+----------------+-------------+--------------------------------
[...]
-----------+----------------+-------------+--------------------------------
a < b      | contextually   | b - a > 0   | < is a total ordering relation
           | convertible to |             |
           | bool           |             |

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