范围循环如何推断普通数组大小

fed*_*ino 4 c++ arrays for-loop range c++11

请考虑以下代码段:

#include <iostream>

int main() {
  int s[6] {0, 1, 2, 3, 4, 5};
  for ( auto && i: s ) {
    std::cout << " " << i << std::endl;
  }
}
Run Code Online (Sandbox Code Playgroud)

这在g ++和clang ++下编译和运行都很愉快.
它在许多帖子中被认为是理所当然的(例如这里这里),但我不清楚编译器如何在for range没有迭代器的情况下正确地推断出数组的大小.
任何人都可以回答或添加引用的链接吗?

sky*_*ack 5

根据工作草案[ 6.5.4/1 ]:

基于范围的声明

for ( for-range-declaration : for-range-initializer ) statement
Run Code Online (Sandbox Code Playgroud)

相当于

{
  auto &&__range = for-range-initializer ;
  auto __begin = begin-expr ;
  auto __end = end-expr ;
  for ( ; __begin != __end; ++__begin ) {
      for-range-declaration = *__begin;
      statement
  }
}
Run Code Online (Sandbox Code Playgroud)

哪里

[...]

begin-expr和end-expr确定如下:

  • 如果for-range-initializer是数组类型R的表达式,则begin-expr和end-expr分别是__range和__range + __bound,其中__bound是数组绑定的.如果R是一个未知大小的数组或一个不完整类型的数组,则该程序是不正确的;

[...]

所以它主要起作用@VladFromMoscow在他的回答中已经提到过.