根据这个问题,并假设我对容器本身有一个可变引用,则可以使用以下方法安全地删除迭代器的常量性:
foo::const_iterator cit = ... ;
foo::iterator it = c.erase( cit, cit );
Run Code Online (Sandbox Code Playgroud)
但是,根据此代码,这似乎不适用于forward_list的等效项erase_after::
#include <iostream>
#include <forward_list>
typedef std::forward_list<int>::const_iterator CIT;
typedef std::forward_list<int>::iterator IT;
int main()
{
std::forward_list<int> m{1, 2, 3};
CIT cit = m.begin();
IT it = m.erase_after(cit, cit); // Segmentation fault!
std::cout << *it;
}
Run Code Online (Sandbox Code Playgroud)
那么有没有办法删除这个类的const迭代器的constness?最好不是通过迭代!
你有一个分段错误,因为你违反了 的前提条件erase_after(),它指出范围(first, last)传递给
iterator erase_after(const_iterator first, const_iterator last);
Run Code Online (Sandbox Code Playgroud)
应该是一个有效的范围。请注意,这是()- 范围的类型,而不是[),因此两端都被排除在外。这就是为什么(cit, cit)不是有效范围的原因erase_after。
海湾合作委员会-D_GLIBCXX_DEBUG 抱怨:
错误:函数需要一个有效的迭代器 range
(__pos, __last),__pos应在之前且不等于__last。