[英]C++: using const with STL iterators
从Effective C ++ ,第3项
/* case1 */ const std::vector<int>::iterator i // i acts like a T* const
/* case2 */ std::vector<int>::const_iterator ci // ci acts like a const T*
基本上'const'适用于其左边的任何东西(除非没有任何东西,在这种情况下它适用于它的直接权利)。
当我首先阅读书中的第3项时,我预计它将在case1和case2中反过来。
我应该把这个案子当作例外吗? 或者是否有一些我缺失的更深层次的理解?
该规则与宣传的一样有效。
const std::vector<int>::iterator i
右边的项是iterator
:迭代器是不可变的。 你不能指定迭代器指向向量中的不同项,你不能递增它,它总是指向它被初始化的项。 但是,您可以更改指向的项目。
这很少是期望的行为,这就是const_iterator
typedef存在的原因。
std::vector<int>::const_iterator ci
迭代器可以四处移动,但指向的项目无法修改。 这几乎总是你想要的 - 你想迭代一个向量但不能修改它的内容。
这里没有const
关键字,因此您无法使用该规则来解决问题。 对于这个,您只需要了解const_iterator
要记录的内容。
你可以认为这是因为,如果迭代器中的typedef
编着,像这样:
typedef T* iterator;
typedef const T* const_iterator;
当您将const
添加到其中任何一个时,它将应用于顶层 ,即应用于指针本身,而不是指向的对象,因此以下等效项包含:
const iterator it; // is the same as:
T* const it;
const const_iterator it; // is the same as:
const T* const it;
它们也不例外; 这就是所有typedef
的工作方式。
引用的规则绝对适用于const
关键字。 但是,在处理迭代器时, const_iterator
类仅被命名为(它同样可以是readonly_iterator
),因此关于const
关键字的规则不适用。
但是,您可以像这样声明案例1:
std::vector<int>::iterator const i
就像你可以指定const int x
或int const x
。
迭代器指向的类型也在其容器的模板参数中指定,因此排序与声明普通变量不同。
我无法看到这里有任何特定的经验法则 - 你的帖子中的评论是正确的想法,你只需要学习将const_iterator
视为const T*
等等。
我认为const_iterator让你很困惑。 这是一个更简单的typedef的例子。
typedef int* Type;
typedef const int* ConstType;
int main() {
const Type a; // int * const
ConstType b; // const int *
}
情况1中的const
适用于迭代器,因此它使迭代器本身成为常量。 它对迭代器“指向”的项没有任何影响。 (这就像在T* const
,其中指针是const
,而不是指向T
)
在第2种情况下, const
只是名称const_iterator
一部分,因此无法真正推断出const
是什么。 这个类可能只有一个坏名字,根本就没有关于它的const。 但是在这种情况下, const_iterator
不允许修改它的目标元素,因为它的定义与标准库中的类似。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.