为什么迭代器需要是可默认构造的

sbi*_*sbi 33 c++ iterator stl standard-library language-lawyer

前向,双向随机访问类别的迭代器需要是默认构造的.

为什么这样,为什么输入输出运算符不必是默认可构造的?

Jon*_*ely 14

需要使用前向迭代器和更强的函数来引用一些外部序列(参见[forward.iterators]/6,其中说"如果a并且b都是可解除引用的,那么a == b当且仅当*a*b并且绑定到同一个对象时.")

这意味着它们通常只是对其他东西的轻量级句柄(例如,指向容器中的元素或节点的指针),因此没有理由不要求它们可以默认构造(即使默认构造创建了单个迭代器)在分配新值之前不能用于任何事情).所有非病态*前向迭代器都可以支持默认构造,依赖于此可以使一些算法更容易实现.

只满足输入迭代器或输出迭代器要求(并且没有更强)的迭代器可能包含自己修改的状态operator++,因此可能无法对该状态进行默认构造.没有只对输入/输出迭代器进行操作的算法需要默认构造它们,所以它不是必需的.

  • 在这里发现"没有真正的苏格兰人"的说法;)

  • 在libstdc ++中(也可能在SGI STL中)至少`std :: search`,`std :: partition_point`和`std :: minmax_element`依赖于默认构造前向迭代器.`std :: rotate`默认构造一个双向迭代器.从理论上讲,它们可以转化为冗余副本(无论如何它们将在以后分配新的值). (10认同)
  • 标准通常不会仅仅因为没有理由而指定某些内容; 他们通常有很好的理由. (8认同)
  • 对我来说,这似乎是特定于STL容器的.很容易想到一些自定义迭代器可以存储比`std :: vector <> :: iterator`更多的状态,并且无法创建该状态.为什么不应该输入和输出迭代器是单数?(实际上,流迭代器是默认构造的.) (2认同)
  • 我怀疑它发生了反过来,即不是故意要求它仅用于向前和更好,它对于输入/输出是"不需要的".SGI STL的作者,也许是Stepanov,依赖于DefaultConstructible作为所有迭代器,作为指针的概括.在标准化过程中的某些时候,有人意识到在输入或输出迭代器中运行的算法实际上并不需要默认构造,因此对这些类别的要求被删除了.如果有人不愿意做这项工作,也许它也可能被放弃了前进和双向. (2认同)