为何销毁迭代器指向元素时需使用(&*ptr)格式?
为什么要使用
&*first 而不是直接传迭代器给 destroy? 首先看你给出的 destroy 函数定义:
template<class T> inline void destroy(T* pointer) { pointer->~T(); }
它的参数是指向类型T的原始指针,而不是迭代器。
你疑问的 &*first 做了两件关键的事:
*first:对前向迭代器解引用,拿到迭代器指向的实际对象&:对这个对象取地址,得到指向该对象的原始指针(T*类型)
这一步完全是为了匹配 destroy 函数的参数类型要求——迭代器本身是封装了指针行为的对象(比如 std::vector<T>::iterator 是类类型,不是原生指针),直接把迭代器 first 传给 destroy 会导致类型不匹配,编译器直接报错。只有当迭代器恰好是原生指针(比如 T*)时直接传才有效,但模板要支持所有前向迭代器,所以必须用这种通用方式获取原始指针。
关于你猜测的“是不是因为first指向的元素并非单独分配的?”——其实和元素的分配方式无关,核心就是类型匹配的问题。不管元素是单独分配还是在容器/数组中,destroy 都需要单个对象的指针来调用其析构函数,而迭代器本身不是指针,必须通过 &*first 完成转换。
内容的提问来源于stack exchange,提问作者Yiqun Cui
相关产品推荐
相关产品推荐

