超级SCARY迭代器是否合法?

ybu*_*ill 12 c++ language-lawyer

我知道标准允许std::vector<int, A>为不同的分配器使用相同类型的迭代器A.这称为SCARY迭代器.

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

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

Che*_*Alf 7

回覆

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

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


小智 5

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

我想,不仅仅是任何实施.

24.2迭代器要求[iterator.requirements]

24.2.1一般[iterator.requirements.general]

11在以下部分中,ab表示类型X或的值const 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           |             |

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

  • 由于`a <b`被定义为`b - a> 0`,`-`的约束也适用于`<`. (5认同)
  • 我认为"总排序"要求是标准中的一个错误 (3认同)
  • “......当前流行的现实世界的实现并没有这样做......” - 我很确定他们会这样做。1) 所有线性架构的 AFAIK 指针 `&lt;` 给出总顺序。2) libc++ 通过简单地调用 `&lt;` 来实现 std::less,所以它已经依赖于完全有序的指针,所以它可以将它们用于 `vector::iterator`?有趣的是,它确实将 `std::array` 迭代器定义为指针。 (2认同)