在传递`const_iterator`作为参数时,是否需要编写`const`关键字?

时间:2013-08-07 15:45:46

标签: c++ stl iterator arguments const

static void MyClassMethod(
          std::list<AClass>                 & AnObject,
    const std::list<AClass>::const_iterator & BeginningPoint);

在我的代码中,我传递了const_iteratorconst STL对象。感觉其中一个常数是多余的。

如果我只移除const关键字,或者我只将const_iterator更改为iterator,它有何不同?

2 个答案:

答案 0 :(得分:7)

A const_iterator表示您无法修改它“指向”的对象(迭代器具有指针语义)。 const const_iterator表示您无法修改迭代器本身。

所以:

 const std::list<AClass>::const_iterator it = smth;
 it = smthElse;

是非法的,

 std::list<AClass>::const_iterator it = smth;
 it->nonConstMethodOfAClass();

是非法的。

答案 1 :(得分:6)

std::list<AClass>::iterator&

您可以通过迭代器更改值,并且可以更改迭代器指向函数外部的内容。

std::list<AClass>::const_iterator&

您无法通过迭代器更改值,但可以更改迭代器指向函数外部的值。

const std::list<AClass>::iterator&

您可以通过迭代器更改值,但不能更改迭代器指向函数外部的内容。

const std::list<AClass>::const_iterator&

您无法通过迭代器更改值,也无法更改迭代器指向函数外部的内容。

请注意,迭代器是通过引用传递的。如果它们是按值传递的,那么第一个const就不会那么重要了。这是因为更改迭代器的位置只会影响本地副本。