stl - C++ construct源码中 destroy问题
伊谢尔伦
伊谢尔伦 2017-04-17 13:18:35
0
2
490
template inline void _destroy_aux(ForwardIterator first, ForwardIterator last, _false_type) { for (; first != last; ++first) { destroy(&*first); } }

其中destroy函数为

template inline void destroy(T *ptr) { ptr->~T(); }

问题是,destroy(&*first)中:
first取了值又取了地址,&*first不就等于first吗;
于是我写了一小段测试代码:

//vector的头指针 std::vector v; v.push_back(1); auto first = v.begin(); std::cout /*<< first */<< *first << " " << &*first << std::endl; //内置int的指针 int n = 1; int *p = &n; std::cout << p << " " << *p << " " << &*p << std::endl; 发现vector的指针直接输出会出错,但是经过&*处理就正常输出,而vector源码中的指针用的是内置的,也就是说测试代码中的first本质应该是int指针。这是怎么回事。
伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

reply all (2)
洪涛

Iterator只是简单包装了int*原始指针

std::cout /*<< first */<< *first << " " << &*first << std::endl;

first输出不了只是因为没有重载析取运算符

first这样解引用之后就变成了int,和first本身的类型是不同的,所以&first自然能输出

int main() { std::vector vec; vec.push_back(1); auto f = vec.begin(); // Iterator的指针 是protected的,方便起见,直接转换输出 std::cout <<"f ->"<<*((int*)&f)<<" *f -> "<<*f<< &*f -> "<<&*f<

    伊谢尔伦

    迭代器有*操作符(返回的是一个引用), 再取地址的话, 就相当于拿到了指针.
    迭代器本身不等于指针, 可以理解为跟指针类似的东西, 但是并不是. 试着想想,vector的内存是连续的, 那么我用一个指针当迭代器,++操作符是可以正常工作的; 但是我如果是一个list或者一个map, 那都是不能随便++的,++操作符里面是有逻辑的. 你可以仔细看看代码.

      Latest Downloads
      More>
      Web Effects
      Website Source Code
      Website Materials
      Front End Template
      About us Disclaimer Sitemap
      php.cn:Public welfare online PHP training,Help PHP learners grow quickly!