'结肠'和'汽车'在for循环c ++?需要一些帮助来理解语法

时间:2016-02-18 19:03:34

标签: c++ c++11

我需要对以下c ++语法进行一些解释:

for(const auto& ioDev : deviceList)

鉴于:

std::vector<Device *> deviceList

具体来说,我很担心&#39;:&#39;以及&#39; auto&#39;?

的用法

3 个答案:

答案 0 :(得分:12)

这是一个基于循环的范围,它具有相同的基本行为:

for(auto it = deviceList.begin(); it != deviceList.end(); ++it)
{
   const auto& ioDev = *it;
}

基于for循环的范围已经很快成为我最喜欢的结构之一,它很简洁,当你需要迭代整个范围时,同样有效(并且效率最高)。

如果你需要典型for循环的其他结构(比如在某些情况下提前退出),那么基于范围的for不适用于那个用例。

答案 1 :(得分:8)

正如Chad的回答所述,您的for循环使用其vectorbegin迭代器迭代end。这是冒号:语法的行为。

关于您的const auto &语法:您应该想象出来的代码是什么:

// "i" is an iterator
const auto& ioDev = *i;

表达式*i是(引用)容器中元素的类型:Device *。这是auto的推导类型。由于您const &附加了auto,因此变量ioDev是对推导类型(指针)的const引用,就好像它是以这样的方式声明: / p>

const Device *& ioDev = *i;

似乎不必要地复杂化;如果你只需要正常的迭代(而不是例如操纵指针的地址,我认为这是极不可能的),使用一个普通的未经修改的auto

for (auto ioDev : deviceList)

或显式类型:

for (Device* ioDev : deviceList)

答案 2 :(得分:2)

“new”for循环只是迭代deviceList的所有元素。在循环体的每次迭代中,ioDev是对deviceList的每个元素的const引用,连续。

至于ioDev的类型:它的类型为Device *const &,如下所示:

#include <vector>                                                                                                                                                                                            
#include <type_traits>


using namespace std;


int main()
{
    vector<int *> v;

    for(const auto &r: v)
    {
        static_assert(is_same<decltype(r), int *const &>::value, "wrong type");
    }
}