原因很简单:常量迭代器不是常量迭代型。这意味着你能够改变常量迭代器的长度(例如:用++来增加长度)。然而,你不能改变常量迭代器所指向的对象的值。
让我们进一步阐明一下。如果你把迭代器考虑成指向T的指针,那么常量迭代器不是指向T的常量指针,而是指向常量T的非常量指针。
在接下来的例子中,常量迭代器的长度成功地增加了。而另一方面,想要通过迭代器,而改变其中的元素值的企图却失败了,因为它是常量迭代器。
std::vector<double> results;
results:push_back(98.99);
results:push_back(86.33);
std::vector<double>::const_iterator it = vi.begin();
++it; //正确,改变迭代器,而不是其中的元素
*it = 100.5; //错误,不能用const_iterator改变其中元素
总之,const_iterator的使用者,不允许通过其迭代器,而改变其指向的元素值。
本文作者Danny Kalev 是一个系统分析家、软件工程师,在C++和面向对象设计方面有着14年的专业经验。