为什么不将std :: set <K,C,A> :: erase作为const_iterator?

Arm*_*yan 5 c++ stl set design-rationale

看来,根据ISO 14882 2003(又名C的神圣的标准++)std::set<K, C, A>::eraseiterator作为参数(不是const_iterator)

从23.3.3 [2]

void erase(iterator position);

值得注意的是,在我对VS2008附带的STL的实现中,const_iterator当我尝试用另一个编译器编译我的代码时,擦除会导致令人不快的意外.现在,由于我的版本采用了a const_iterator,因此可以用a实现擦除const_iterator(就好像它不是不言而喻的).

我认为标准委员会考虑了一些实现(或者现有的实现),这需要擦除才能获得iterator.

  • 如果您同意这种情况,请您描述一个实现,set::erase其中需要修改将要删除的元素(我不能).
  • 如果你不同意,请告诉我为什么他们会在地球上做出这个决定?我的意思是,删除一个元素只是一些重新排列的指针!

编辑

我刚想到即使在迭代器的情况下你也无法修改集合中的元素.但问题仍然存在 - 为什么不是const_iterator,特别是如果它们在某种意义上是等同的

evn*_*vnu 4

这是一个缺陷。从 C++11 开始,set<K,C,A>::erase采用const_iterator

iterator erase(const_iterator position);
Run Code Online (Sandbox Code Playgroud)

2007 年的这篇论文阐述了该错误并展示了避免该错误的实现方法。我不确定这篇论文是否是标准更改的原因,但这可能是一个不错的猜测。