代码之家  ›  专栏  ›  技术社区  ›  monzie

带指针容器的自动类型推断

  •  0
  • monzie  · 技术社区  · 7 年前

    我不明白为什么编译器决定在第三个for循环中为迭代器itr使用指向in的指针,而不是像前两个循环那样使用指向指针的指针。我试图分析 the deduction rules 但找不到相关部分。

    void foo()
    {
        vector<int*> a;
        int b[] =   { 1, 2, 3 };
    
        for (int i = 0; i < 3; i++)
        {
            a.push_back(&b[i]);
        }
        for (vector<int*>::iterator itr = a.begin(); itr != a.end(); ++itr)
        {
            //itr is a pointer to a pointer to an int
            cout << **itr << endl;
        }
        for (auto itr = a.begin(); itr != a.end(); ++itr)
        {
            //itr is a pointer to a pointer to an int
            cout << **itr << endl;
        }
        for (auto itr : a)
        {
            //itr is a pointer to an int.  Why?
            cout << *itr << endl;
        }
    }
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Edgar Rokjān    7 年前

    从…起 range for :

    attr(可选)for(range\U声明:range\U表达式)loop\U语句

    ...

    range\u声明-命名变量的声明, 其类型为 序列元素的类型,表示为 range\u表达式或对该类型的引用 . 经常使用自动 自动类型扣除的说明符

    for (auto itr : a)
    

    在这里 itr 获取 a int* .

    您可以这样写:

    for (auto& itr : a)
    

    并获取对 ,但无法获取指向该类型的指针。

    另一方面,迭代器表示一个类似指针的实体,它指向容器的元素,这就是为什么使用两次解引用:一次获取迭代器指向的元素的值,并且具有 内景* ,第二次获取实际 int 值来自 内景* .