Laz*_*zer 2 c++ templates stl const effective-c++
从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*
Run Code Online (Sandbox Code Playgroud)
基本上'const'适用于其左边的任何东西(除非没有任何东西,在这种情况下它适用于它的直接权利).
当我第一次阅读本书中的第3项时,我预计它将在case1和case2中反过来.
我应该把这个案子当作例外吗?或者是否有一些我缺失的更深层次的理解?
该规则与宣传的一样有效.
const std::vector<int>::iterator i
Run Code Online (Sandbox Code Playgroud)
右边的项目是iterator:迭代器是不可变的.你不能指定迭代器指向向量中的不同项,你不能递增它,它总是指向它被初始化的项.但是,您可以更改指向的项目.
这很少是期望的行为,这就是const_iteratortypedef存在的原因.
std::vector<int>::const_iterator ci
Run Code Online (Sandbox Code Playgroud)
迭代器可以四处移动,但指向的项目无法修改.这几乎总是你想要的 - 你想迭代一个向量但不能修改它的内容.
这里没有const关键字,因此您无法使用该规则来解决问题.对于这个,你只需要了解const_iterator记录的内容.
您可以认为它就好像迭代器是这样typedef编辑的:
typedef T* iterator;
typedef const T* const_iterator;
Run Code Online (Sandbox Code Playgroud)
当您添加const到其中任何一个时,它将应用于顶层,即指针本身,而不是指向的对象,因此以下等效项包含:
const iterator it; // is the same as:
T* const it;
const const_iterator it; // is the same as:
const T* const it;
Run Code Online (Sandbox Code Playgroud)
它们也不例外; 这就是所有typedef的工作方式.
| 归档时间: |
|
| 查看次数: |
429 次 |
| 最近记录: |