[英]'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 循环使用其begin
和end
迭代器迭代您的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.