C++ const_iterator to iterator for forward_list

c z*_*c z 3 c++

根据这个问题,并假设我对容器本身有一个可变引用,则可以使用以下方法安全地删除迭代器的常量性:

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?最好不是通过迭代!

Evg*_*Evg 5

你有一个分段错误,因为你违反了 的前提条件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