嵌套基于范围的for循环不适用于C ++ 17

时间:2017-10-12 05:54:54

标签: c++ for-loop c++17

我在C ++ 17中制作了嵌套的Range-based for loop程序。

#include <iostream>
#include <vector>

int main() 
{
    std::vector<int> v = {0, 1, 2, 3, 4, 5};

    for (int i : v) 
    {
        for (int a : i)
            std::cout << a << ' ';
    }
}

GCC产生错误:

main.cpp: In function 'int main()':
main.cpp:10:22: error: 'begin' was not declared in this scope
         for (int a : i)

所以,

  • 为什么GCC会为基于循环的嵌套范围生成错误?
  • 基于循环的范围范围是什么?

2 个答案:

答案 0 :(得分:3)

int main()  {
  std::vector<int> v = {0, 1, 2, 3, 4, 5};

  for (int i : v) {
    for (int a : i)
        std::cout << a << ' ';
  }
}

这段代码是无意义的,编译器将自己绑定到试图理解它的结。

因此错误消息毫无意义。这就像给编译器输入随机字符一样,并且编译器返回&#34;缺少;&#34;。

特别是:

    for (int a : i)

其中i的类型为int。 Thia代码尝试迭代int

可以迭代的类型是数组,以及具有成员begin / end的用户/库定义类型,以及非成员自由函数begin / {{ 1}}在他们的命名空间中,end / begin返回迭代器(或指针)之类的东西。

end不是数组,也不是用户或库定义。

gcc试图将其视为可迭代对象。它不是一个数组。它没有成员开始。它没有在包含非成员int的命名空间中定义。这使得gcc放弃了该poimt,并输出一条消息,表明它无法在无意义的位置找到非成员的开头(因为begin没有定义点)。

此问题与嵌套循环无关。

int

会产生同样的错误。

答案 1 :(得分:2)

这一行

public int Type { get; set; }

毫无意义。如果您阅读了您提供的基于范围的循环的链接,您会发现内部循环将等同于以下代码,

for (int a : i)

{ auto && __range = i ; auto __begin = begin(__range) ; auto __end = end(__range) ; for ( ; __begin != __end; ++__begin) { a = *__begin; std::cout << a << ' '; } } begin函数对于向量,贴图,范围等非常有用,因为它们提供了迭代器。它们也由数组的语言定义,它们指向数组的开头和结尾,因此迭代语法是相同的。对于普通end变量,它们

有了这些信息,编译器提供的信息就完全清楚了:它指的是转换代码第三行中缺少int。它没有在内部循环出现的范围内声明(这是:外部循环)在这一点上只是一个不相关的细节,它也没有在程序中的任何其他位置定义。