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

时间:2018-01-20 18:22:42

标签: c++ pointers stl auto

我不明白为什么编译器决定在第3个for循环中指向迭代器itr的指针,而不是在前2个循环中指向指针的指针。我试图解析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 个答案:

答案 0 :(得分:2)

来自range for

  

attr(可选)for(range_declaration:range_expression)loop_statement

     

...

     

range_declaration - 命名变量的声明,的类型是   由...表示的序列元素的类型   range_expression或对该类型的引用。经常使用汽车   自动类型扣除的说明符

for (auto itr : a)

此处itr获取a中元素的类型,即int*

你可以写:

for (auto& itr : a)

并获取a中元素的引用,但无法获取指向该类型的指针。

另一方面,迭代器表示一个类似指针的实体,它指向容器的元素,这就是你使用解除引用两次的原因:一次获取迭代器指向的元素的值并且具有类型int*,第二次从int获取实际int*值。