繁体   English   中英

for循环c ++中的“冒号”和“自动”? 需要一些帮助来理解语法

[英]'colon' and 'auto' in for loop c++? need some help understanding the syntax

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

for(const auto& ioDev : deviceList)

鉴于:

std::vector<Device *> deviceList

具体来说,我对“:”和“自动”的用法感到困惑?

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

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

基于范围的 for 循环很快成为我最喜欢的结构之一,它很简洁,当您需要迭代整个范围时,它会尽可能地(并且尽可能高效)地工作。

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

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

关于你的const auto &语法:你应该想象一下它产生了什么代码:

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

表达式*i是(引用)容器中元素的类型: Device * 这是auto的推导类型。 因为您已将const &附加到您的auto ,所以变量ioDev是对推导类型(指针)的const引用,就好像它是这样声明的:

const Device *& ioDev = *i;

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

for (auto ioDev : deviceList)

或显式类型:

for (Device* ioDev : deviceList)

“新” for循环简单地遍历的所有元素deviceList 在循环体的每次迭代中, ioDev是一个常量引用每个elments的deviceList ,依次。

至于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");
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM