0

我对 const_iterators 有点困惑。例如,让我们考虑一下函数:

void functionForConstIterator(std::list<int> const& list, std::list<int>::const_iterator& const_iter)
{
    const_iter = list.begin();
}

现在我可以写:

void main()
{
    std::list<int> myList = {1, 2, 3, 4, 5};
    std::list<int> const& listRef = myList;
    std::list<int>::iterator iter;

    functionForConstIterator(listRef, iter);
    *iter = 7;

    for (auto it = myList.begin(); it != myList.end(); ++it)
        std::cout << *it << " ";
}

输出为 {7, 2, 3, 4, 5}。为什么?如果我在容器上获得 const 引用,我不必更改它。这是 Visual Studio 2015 编译器。

4

2 回答 2

2

如果我在容器上获得 const 引用,我应该无法更改它。

这是正确的。但是,您没有在容器上获得 const 引用。尽管它的名字,const_iterator不是语言的const角度来看。该名称const是为了向程序员表明您将无法通过此迭代器更改容器。迭代器本身仍然是一个公平的改变目标。

而且,迭代器const_iterator只是函数内部的一个。在函数之外,即 in main,它是一个常规std::list<int>::iterator,在调用函数之前和之后保持完全可变。

于 2016-07-22T11:22:48.323 回答
1

Microsoft STLlist::iterator源自list::const_iterator. 这就是为什么您可以将引用传递给iterator期望 aconst_iterator没有问题的函数。

因此,函数内部的赋值是一个切片赋值,但这在这种情况下没有特别的效果,因为iterator没有虚函数并且没有引入新成员。

因此,您已经悄悄地将 a 转换const_iteratoriterator感谢分配。

编辑:我为此创建了一个连接问题:

https://connect.microsoft.com/VisualStudio/feedback/details/2962643

于 2016-07-22T11:44:41.897 回答