C++ construct源码中 destroy问题

发布于 2022-09-02 00:19:47 字数 869 浏览 11 评论 0

template<class ForwardIterator>
inline void _destroy_aux(ForwardIterator first, ForwardIterator last, _false_type)
{
    for (;  first != last; ++first) 
    {
        destroy(&*first);
    }
}

其中destroy函数为

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

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


//vector的头指针
std::vector<int> 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指针。这是怎么回事。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

江湖正好 2022-09-09 00:19:47

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

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

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

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


int main() {
    std::vector<int> vec;

    vec.push_back(1);   

    auto f = vec.begin();

    // Iterator的指针 是protected的,方便起见,直接转换输出
    std::cout <<"f ->"<<*((int*)&f)<<" *f -> "<<*f<< &*f -> "<<&*f<<std::endl;
    
    return 0;
}

rungcc是个小脚本

风筝有风,海豚有海 2022-09-09 00:19:47

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文