【发布时间】:2011-09-12 11:05:03
【问题描述】:
我想表达一个迭代器是 const 的(即你不能增加或减少它)但它产生的东西是非常量的:
iterator const it = foo.begin();
it++; // error
*it = ...; // not an error
如果iterator是一个指针,我可以说:
指针 //迭代器
pointee // 它产生的东西
但如果它不是指针,我不确定。我考虑过使用container 作为“pointee”替代品,但迭代器根本不绑定到容器。例如,输入迭代器可以绑定到文件或 STDIN。以下内容是否有效并被其他人使用?
迭代器 //迭代器
迭代 //它产生的东西
很高兴得到任何指导!
【问题讨论】:
-
我无法想象你描述的东西不是指针。你能举个例子吗?
-
@Paul:你无法想象一个不是指针的迭代器? C++ 中
ostream_iterator的实例怎么样,它怎么可能是一个指针?或者可以想象,Java 中Vector上的迭代器可能是基于索引的,而不是一些使用 JNI 指针的优化。事实上,很少有迭代器类型可以真正成为指针,尽管在某些情况下,如果它们有一个指针数据成员而没有其他数据,你不会感到惊讶。 -
我一直把它称为iteratee,但现在你提到它,我花了一些时间谷歌这个词,它似乎不正确。
-
@Steve:根据我的阅读,所描述的是一个不迭代的迭代器。即以某种方式指向集合的特定成员的对象,并且不能修改为指向任何其他成员。虽然我同意这实际上可能不是指针本身(在内存地址的意义上),而是包含指针数据成员的对象,或索引该特定成员的其他方式;这东西的行为似乎很尖锐。
-
@Paul:在 C++ 中,您不能增加特定对象的事实并不意味着您不能增加它的副本——迭代器具有值语义,而 constness Johannes正在谈论的是变量的属性,而不是变量所持有的值的属性。
iterator const it = foo.begin(); it++ /* error */; iterator it2 = it; it2++; /* fine, points to the next thing in sequence */。我不认为char *const比char*更具有指向性,我也不认为iterator const比iterator更具有指向性。
标签: language-agnostic iterator const-iterator