基于嵌套范围的 for 循环在 C++17 中不起作用

msc*_*msc -6 c++ for-loop c++17

我在 C++17 中制作了基于嵌套范围的 for 循环程序。

#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 << ' ';
    }
}
Run Code Online (Sandbox Code Playgroud)

GCC 产生错误:

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

所以,

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

Yak*_*ont 5

这个问题与嵌套循环无关。

下面的代码片段是无意义的,编译器试图理解它:

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

  for (int i : v) {
    for (int a : i)
        std::cout << a << ' ';
  }
}
Run Code Online (Sandbox Code Playgroud)

因此,该错误消息也是无意义的。这就像向编译器提供随机字符,然后编译器返回“缺失;”。

尤其:

for (int i : v)
    for (int a : i)
Run Code Online (Sandbox Code Playgroud)

第一行声明i为类型int。那么,第二行如何迭代int?int不是数组,也不是用户/库定义的。

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

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

这将产生相同的错误:

int i;
for( int a:i );
Run Code Online (Sandbox Code Playgroud)