我需要对以下c ++语法进行一些解释:
for(const auto& ioDev : deviceList)
鉴于:
std::vector<Device *> deviceList
具体来说,我很担心&#39;:&#39;以及&#39; auto&#39;?
的用法答案 0 :(得分:12)
这是一个基于循环的范围,它具有相同的基本行为:
for(auto it = deviceList.begin(); it != deviceList.end(); ++it)
{
const auto& ioDev = *it;
}
基于for循环的范围已经很快成为我最喜欢的结构之一,它很简洁,当你需要迭代整个范围时,同样有效(并且效率最高)。
如果你需要典型for循环的其他结构(比如在某些情况下提前退出),那么基于范围的for不适用于那个用例。
答案 1 :(得分:8)
正如Chad的回答所述,您的for循环使用其vector
和begin
迭代器迭代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");
}
}