用 (*it).m 还是 it->m 摘自《Extended STL》 标准库要求,所有值类型为聚合类型的迭代器必须支持指针成员选取运算符(operator ->()),下面是使用该运算符的示例代码: struct X { int x; }; some_iterator<X> si = . . . some_iterator<X> si2 = . . . some_iterator<X> end = . . . if( end != si && end != si2) { si->x = si2->x; } 标准(C++-03: 24.1.1;1)要求,对一个迭代器应用指针成员选取运算符,在语义上等同于先对其应用解引用运算符,再应用点号成员选取运算符,即it->m与(*it).m等效。 可惜,使用该运算符会遇上麻烦。 假设我们有一个容器类型C,它的实例保存智能指针类型P的实例,P用于管理对象生存期。P上定义了一个release()方法用于提早释放对象。进一步假设,被P管理的类型T上也定义了一个release()方法。在下面代码片断中,我们希望通过该容器的迭代器类型I的一个实例,调用T::release()方法: C cont = . . . I it = cont.begin(); it->release(); 不幸的是,这段代码调用的不是T::release()方法,它调用的是P::release()方法,从而销毁了T的实例。当我们再次使用cont这个容器的时候,就可能遇到各种奇怪的问题,以下代码才是真正实现我们想法的代码: C cont = . . . 标签: C ------分隔线----------------------------
|