摘自《Extended STL》
标准库要求,所有值类型为聚合类型的迭代器必须支持指针成员选取运算符(operator ->()),下面是使用该运算符的示例代码:
| 以下是引用片段: struct X { int x; }; some_iterator si = . . . some_iterator si2 = . . . some_iterator end = . . . if( end != si && end != si2) { si->x = si2->x; } |
可惜,使用该运算符会遇上麻烦。
假设我们有一个容器类型C,它的实例保存智能指针类型P的实例,P用于管理对象生存期。P上定义了一个release()方法用于提早释放对象。进一步假设,被P管理的类型T上也定义了一个release()方法。在下面代码片断中,我们希望通过该容器的迭代器类型I的一个实例,调用T::release()方法:
| 以下是引用片段: C cont = . . . I it = cont.begin(); it->release(); |
| 以下是引用片段: C cont = . . . I it = cont.begin(); it->->release(); |
为使C++满足我们的想法,我们必须放弃成员选取运算符而转用解引用运算符,就像以下代码示例中一样:
| 以下是引用片段: C cont = . . . I it = cont.begin(); (*it)->release(); |
在迭代器中支持指针成员选取运算符,没什么实质的意义,而仅仅是语法糖。我认为标准中将这规定为迭代器概念的一个特性是严重的错误。在我的日常工作中,除了仅有几个特例外,我完全避免使用迭代器的指针成员选取运算符,而使用解引用和点号成员选取运算符。我建议你也这么做。
Tip: Prefer iterator dereference and the dot member selection operator ((*it).m) over the pointer member selection operator (it->m).
提示: 使用解引用及点号成员选择运算符((*it).m)代替指针成员选择运算符(it->m)。