C++ 使用'对集合进行迭代;常量迭代器';在一个声明为';常数';导致错误

C++ 使用'对集合进行迭代;常量迭代器';在一个声明为';常数';导致错误,c++,stl,iterator,constants,deque,C++,Stl,Iterator,Constants,Deque,此方法: void LRU::displayQueue() const { for(iter = m_buffer.begin(); iter != m_buffer.end(); ++iter) std::cout << (*iter) << " "; std:: cout << std::endl; } 删除displayQueue方法中的const将消除编译器错误,但由于此函数不应修改deque中的任何数据,因此我希望通过保持代

此方法:

void LRU::displayQueue() const
{
   for(iter = m_buffer.begin(); iter != m_buffer.end(); ++iter)
      std::cout << (*iter) << " ";
   std:: cout << std::endl;
}

删除
displayQueue
方法中的
const
将消除编译器错误,但由于此函数不应修改
deque
中的任何数据,因此我希望通过保持代码“const correct”来明确这一点。当我的迭代器是
常量迭代器时,为什么会出现错误?

通过设置常量迭代器成员变量的值来修改对象,从而使函数的常量限制无效。使用局部变量


const\u迭代器
只意味着迭代器不能修改序列,但您不是在修改序列,而是在修改成员变量迭代器本身。

在类型为
LRU
的const对象中,
iter
成员是const,因此您不能在该循环中修改它。你需要单独复印一份。这就是标准库算法采用迭代器对象的原因:因此它们可以修改迭代器对象以在序列中移动,即使存在一个常量的底层容器对象。

void LRU::displayQueue()const
void LRU::displayQueue() const
{
  // std::_Deque_iterator<int, const int&, const int*> l_iter = m_buffer.begin();
  for(auto l_iter = m_buffer.begin(); l_iter != m_buffer.end(); ++l_iter)
    std::cout << (*l_iter) << " ";
  std::cout << std::endl;
}
{ //std::_Deque_迭代器l_iter=m_buffer.begin(); 对于(自动l_iter=m_buffer.begin();l_iter!=m_buffer.end();++l_iter)
std::cout您不能在
const
成员方法中修改类的任何成员,这就是您在此处尝试执行的操作:

for(iter = m_buffer.begin();iter != m_buffer.end(); ++iter)
    ^^^^^^^                                         ^^^^^^
iter
类LRU
的成员,因此不能在
const
成员函数中分配、增加或以其他方式更改它

一种解决方案是使iter可更改:

mutable std::deque<int>::const_iterator iter;
可变std::deque::const_迭代器iter;
但我的感觉是,
mutable
的大多数用法都表明存在设计缺陷。在这种情况下,我怀疑首先让
iter
成为
类LRU
的成员是一个潜在的设计缺陷。你为什么需要/想要这个


<> >,而不是制作<代码> ITER <代码>一个可变的成员,我首先考虑的不是它是一个成员,而是使用一个局部变量来代替.< /p> ,因为您的成员函数是一个const,这意味着您保证不改变这个函数中的任何成员。有错误。

iter
LRU
的成员吗?如果是,那就是问题。
iter
LRU
类成员吗?如果是,除非声明它是
可变的,否则不能在常量函数中修改它。请尝试cbegin()和cend()获取常量迭代器。@CaptainObvlious:这不是问题所在。这对我来说是一个小小的“derp”时刻。谢谢各位。是的,这应该可以工作,但它没有解释问题是什么或者为什么要解决它。它还引入了一个潜在的新问题:名称隐藏。在这种情况下,
auto
将推断出什么类型?
for(iter = m_buffer.begin();iter != m_buffer.end(); ++iter)
    ^^^^^^^                                         ^^^^^^
mutable std::deque<int>::const_iterator iter;