搜尋

首頁  >  問答  >  主體

stl - C++ construct源码中 destroy问题

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指针。这是怎么回事。
伊谢尔伦伊谢尔伦2803 天前582

全部回覆(2)我來回復

  • PHP中文网

    PHP中文网2017-04-17 13:20:35

    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;
    }

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 13:20:35

    迭代器有*操作符(返回的是一個引用), 再取地址的話, 就相當於拿到了指針.
    迭代器本身不等於指針, 可以理解為跟指針類似的東西,但是並不是. 試著想想, vector的內存是連續的, 那麼我用一個指針當迭代器, ++操作符是可以正常工作的; 但是我如果是一個list或者一個map , 那都是不能隨便++的, ++操作符裡面是有邏輯的. 你可以仔細看看代碼.

    回覆
    0
  • 取消回覆