#include<iostream>
#include<list>
using namespace std;
int main()
{
list<int*> strInt;
int *a = *strInt.begin();
return 0;
}
上面的代码在vc6.0中编译和执行都能通过,在vs2005中编译和链接没问题,执行时报错: list iterator not dereferencable.
意思是:list的iterator是不可解引用的。这时因为:你所定义的list的元素类别是:int*(即指针),而strInt.begin()返回
的是元素的迭代器,而迭代器的功能就像指针,它是指向容器中元素的。你只有对迭代器解引用才能获得元素(在你的代码中,元素类型是int*),所以才有:int *a=*strInt.begin(); 之所以执行出现错误,是因为strInt是空容器,它的beging()是等于end()的,迭代器实现很有可能是:typedef list<value_type>::value_type* iterator;或者是将迭代器实现为在其内部维护一个指向元素的指针的类。无论哪种实现,迭代器接口都是一样的。不妨假设是第一种实现,那么迭代器类型就是:int**。由于容器为空,所以begin()和end()相等,不指向任何元素,也即迭代器类内部指针被赋值为null,在上面假设下就是:
int **_begin=null;所以*begin()的使用就是在执行*null,显然这是会导致执行期异常。vc6执行不报错,有可能是stl实现版本问题,它对标准支持不好。