传递“const_iterator”作为参数时,我是否需要编写“const”关键字
Do I need to write the `const` keyword when passing a `const_iterator` as argument?
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&
不能通过迭代器更改值,也不能更改迭代器指向函数外部的内容。
请注意,迭代器是通过引用传递的。如果它们是按值传递的,那么第一个常量就没有那么重要了。这是因为更改迭代器的位置只会影响本地副本。
相关文章:
- 是否应该在模板化代码中完全避免const
- 如果变量名称不跟在 char* 后面,const char* 是否有效?
- 是否有技术原因阻止 Java 中的 final C++ 像 const 一样严格?
- 知道模板参数在编译时是否为 const char*?
- "this"指向的对象是否与 const 对象相同?
- c++ 是否保证标头初始化的静态 const 成员跨编译单元和库共享单个实例?
- std::vector::assign/std::vector::operator=(const&) 是否保证在"this"中重用缓冲区?
- const-ref传递的模板化参数是否经过优化,以便在足够小时按值传递
- 是否允许使用初始值设定项列表将const数组引用实例化为构造函数参数
- const变量是否可以在具有默认值的参数中赋值(作为可选参数)
- 如何检查函数是否真的获得了定义为 const 的变量?
- 修改数据是否由 const shared_ptr&Ok 传递?
- 从内部使用静态 std::string 的函数返回 const char * 是否安全?
- 是否可以交换在 c++ 中作为函数 func(say) 中的参数传递的 const 向量的两个元素,例如:vector<int>func (const vector<int>&
- 将shared_ptr转换为<T> shared_ptr<const T>是否会更改它所指向的对象?
- const 是否允许在这里进行(理论)优化?
- 删除标头中用作函数参数的"primitive"类型前面的"const"是否更好?
- 在处理无状态对象时,将它们标记为const是否仍有性能优势
- 对于obj(obj*const a=obj const*b),int*const a=int const*b是否为tru
- const是否意味着C++11中的线程安全