传递“const_iterator”作为参数时,我是否需要编写“const”关键字

Do I need to write the `const` keyword when passing a `const_iterator` as argument?

本文关键字:const 是否 关键字 参数 iterator 传递      更新时间:2023-10-16
static void MyClassMethod(
          std::list<AClass>                 & AnObject,
    const std::list<AClass>::const_iterator & BeginningPoint);

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

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

const_iterator意味着你不能修改它"指向"的对象(迭代器具有指针语义(。const const_iterator意味着您无法修改迭代器本身。

所以:

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

是非法的,并且

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

是非法的。

std::list<AClass>::iterator&
您可以通过迭代器

更改值,也可以更改迭代器指向函数外部的内容。

std::list<AClass>::const_iterator&

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

const std::list<AClass>::iterator&
可以通过迭代器

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

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

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

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

相关文章: